所以我有这个非常混乱的数据,特别是一栏导致了我很大的问题。 基本上不是每行有一个观察,而是有些行有两个或更多个观察,通常用逗号分隔。
我的挑战是将不同的观察结果分成不同的列,但tidyr包中的单独函数不起作用,因为某些行的观察结果比其他行更多。
所以我认为我需要一些能告诉我每行处理多少逗号分隔的观察结果。然后我可以继续将它们全部分开。但我不知道那可能是什么。
非常感谢您给我的任何帮助。
提前致谢
答案 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"))