2015-02-07 67 views
1

所以我有这个数据非常混乱,特别是一列导致我很大的问题。 基本上不是每行都有一个观测值,有些行有两个或多个观测值,通常用逗号分隔。如何使用每行中的观察值数创建输出?

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

所以我想我需要的东西告诉我在每一行中我处理了多少个逗号分隔的观察值。然后,我可以向前推进,把它们全部分开。但我不知道这可能是什么。

任何帮助,你可以给我将不胜感激。

在此先感谢

+0

您可以在此使用tidyr,使用选项额外的:)谢谢 – 2015-02-07 14:43:59

回答

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 
+0

疯狂的包装,应该成为我的新玩具!肯定的最佳答案! – 2015-02-07 14:59:48

+0

这完全是我所需要的!非常感谢你的帮助 – googleplex101 2015-02-07 15:01:29

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 
+0

你,工作。 – googleplex101 2015-02-07 14:36:59

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")) 
+0

您好我尝试运行您的代码,但错误状态错误strsplit(值,sep,...):未使用的参数(额外=“下降”)。感谢您的帮助到目前为止 – googleplex101 2015-02-07 14:54:06

+0

它在我身边工作,你把正确的括号,进口tidyr? – 2015-02-07 14:56:22

相关问题