如何使用每行中的观察数创建输出?

时间:2015-02-07 14:17:18

标签: r dataframe

所以我有这个非常混乱的数据,特别是一栏导致了我很大的问题。 基本上不是每行有一个观察,而是有些行有两个或更多个观察,通常用逗号分隔。

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

所以我认为我需要一些能告诉我每行处理多少逗号分隔的观察结果。然后我可以继续将它们全部分开。但我不知道那可能是什么。

非常感谢您给我的任何帮助。

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以尝试cSplit(来自@Colonel Beauvel的帖子中的“df”)

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

答案 1 :(得分:1)

也许您可以使用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

答案 2 :(得分:1)

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

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

注意除了单独后,只有strsplit函数!

数据:

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