我想在R中执行以下操作(但可以接受bash中的建议):我有很长的元素列表(20,000个),属于80个组。每个组均以下划线定界符之前的相同字符串开头。我想根据下划线之前的模式将所有元素的列拆分为一个包含80列的新数据框。列的大小将不同,因此NA值是可以接受的。
例如我要拆分的列:
head(df$V1)
FOO1_Yu
FOO1_uN
FOO2_Yo
FOO2_yA
FOO10_nO
FOO10_Yes
FOO1_NoY
期望的结果(新的df,标题包含在第一行中):
head(df2)
FOO1 FOO2 FOO10
FOO1_Yu FOO2_Yo FOO10_nO
FOO1_uN FOO2_yA FOO10_Yes
FOO1_NoY
有什么想法吗? (并预先感谢!)
答案 0 :(得分:1)
以下内容使用reshape2包来获取您想要的结果。请注意,由于列被强制转换为存在缺失值的长格式data.frame,因此将它们替换为NA(您的问题显示了空格,其中列具有两个vs.e元素,但不可能在字段中使用真正的空格data.frame,因为所有行都需要填充某些内容,在本例中为NA(空白)。方法如下: (1)使用str_split将您的名称/值对用“ _”分隔,并将其返回到数据框 (2)使用dcast,其中名称值是您的值字符串的函数
library(reshape2)
head(df$V1)
df <- data.frame(V1=c("FOO1_Yu","FOO1_uN","FOO2_Yo","FOO2_yA","FOO10_nO","FOO10_Yes","FOO1_NoY"),stringsAsFactors = F)
splits <- lapply(df$V1,function(x)
{
if (!grepl("_",x))
{
print(paste("Skipping bad input=",x))
return (NULL)
} else {
pair <- unlist(strsplit(x,split="_"))
name <- pair[1]
value <- x
return (data.frame(name=name,value=value))
}
})
splits <- do.call("rbind",splits)
df <- dcast(splits,value ~ name)
输出结果如下:
value FOO1 FOO2 FOO10
1 FOO1_Yu FOO1_Yu <NA> <NA>
2 FOO1_uN FOO1_uN <NA> <NA>
3 FOO2_Yo <NA> FOO2_Yo <NA>
4 FOO2_yA <NA> FOO2_yA <NA>
5 FOO10_nO <NA> <NA> FOO10_nO
6 FOO10_Yes <NA> <NA> FOO10_Yes
7 FOO1_NoY FOO1_NoY <NA> <NA>