如何创建包含每行中观察值数量的输出?

How to create an output with the number of observations in each row?

所以我的数据非常混乱,特别是一列给我带来了巨大的问题。 基本上不是每行有一个观察值,有些行有两个或更多观察值,通常用逗号分隔。

我的挑战是将不同的观察结果分离到不同的列中,但是 tidyr 包中的单独函数不起作用,因为有些行比其他行有更多的观察结果。

所以我想我需要一些东西来告诉我在每一行中处理多少个逗号分隔的观察结果。然后我也许可以将它们全部分开。但我不知道那东西可能是什么。

如果您能给我任何帮助,我们将不胜感激。

提前致谢

也许您可以使用 strsplit 将逗号分隔的变量拆分为字符串列表,然后使用 sapply 函数计算每个列表元素的长度:

> x <- c("a1,a2,a3", "b1,b2", "c1,c2,c3,c4")
> (tmp <- strsplit(x, ","))
[[1]]
[1] "a1" "a2" "a3"

[[2]]
[1] "b1" "b2"

[[3]]
[1] "c1" "c2" "c3" "c4"

> sapply(tmp, length)
[1] 3 2 4

如果你知道逗号的数量,你可以使用正则表达式:

len = sapply(gregexpr(",",df$x), length) + 1
len
#[1] 3 2 4

然后通过指定额外选项与 tidyr 分开使用:

library(tidyr)
separate(df, x, sep=',', into=paste0('col',1:max(len)), extra = "merge")
#  col1 col2 col3 col4
#1   a1   a2   a3 <NA>
#2   b1   b2 <NA> <NA>
#3   c1   c2   c3   c4

注意后面的separate没有超过strsplit的功能!

数据:

df = data.frame(x = c("a1,a2,a3", "b1,b2", "c1,c2,c3,c4"))

您可以尝试 cSplit("df" 来自@Colonel Beauvel 的 post)

library(splitstackshape)
cSplit(df, 'x', sep=',')
#  x_1 x_2 x_3 x_4
#1:  a1  a2  a3  NA
#2:  b1  b2  NA  NA
#3:  c1  c2  c3  c4