R数据转换
我有一个R数据帧,看起来像这样:R数据转换,r,R,我有一个R数据帧,看起来像这样: z = as.data.frame(list(Col1=c("a","c","e","g"),Col2=c("b","d","f","h"),Col3=c("1,2,5","3,5,7","9,8","1"))) > z Col1 Col2 Col3 1 a b 1,2,5 2 c d 3,5,7 3 e f 9,8 4 g h 1 a b 1 a b 2 a
z = as.data.frame(list(Col1=c("a","c","e","g"),Col2=c("b","d","f","h"),Col3=c("1,2,5","3,5,7","9,8","1")))
> z
Col1 Col2 Col3
1 a b 1,2,5
2 c d 3,5,7
3 e f 9,8
4 g h 1
a b 1
a b 2
a b 5
c d 3
c d 5
c d 7
e f 9
e f 8
g h 1
(第三列是带有逗号分隔值的文本列。)我想将其转换为如下数据框:
z = as.data.frame(list(Col1=c("a","c","e","g"),Col2=c("b","d","f","h"),Col3=c("1,2,5","3,5,7","9,8","1")))
> z
Col1 Col2 Col3
1 a b 1,2,5
2 c d 3,5,7
3 e f 9,8
4 g h 1
a b 1
a b 2
a b 5
c d 3
c d 5
c d 7
e f 9
e f 8
g h 1
有人能建议一种使用apply实现此目的的方法吗?我很接近使用下面的命令,但它不太正确。任何关于更有效的方法的建议都将不胜感激
> apply(z,1,function(a){ids=strsplit(as.character(a[3]),",")[[1]];out<-c();for(id in ids){out<-rbind(out,c(a[1:2],id))};return(out)})
[[1]]
Col1 Col2
[1,] "a" "b" "1"
[2,] "a" "b" "2"
[3,] "a" "b" "5"
[[2]]
Col1 Col2
[1,] "c" "d" "3"
[2,] "c" "d" "5"
[3,] "c" "d" "7"
[[3]]
Col1 Col2
[1,] "e" "f" "9"
[2,] "e" "f" "8"
[[4]]
Col1 Col2
[1,] "g" "h" "1"
>apply(z,1,函数(a){ids=strsplit(as.character(a[3]),“,”)[[1]];out您可以使用ddply
library(plyr)
ddply(z, c("Col1", "Col2"), summarize,
Col3=strsplit(as.character(Col3),",")[[1]]
)
使用重塑
或重塑2
require(reshape2)
merge(cbind(z[,-3], L1=rownames(z)), melt(strsplit(as.character(z$Col3),",")))
给予
很好!两个答案都非常有效,所以不可能选择“更好的”一个。选择这个答案是因为它指向了merge
函数,这似乎是一个很好的通用工具,我也需要学习…我还要注意,我在一个更大的真实数据集上测试了这里提供的两个解决方案,也许毫不奇怪,执行时间几乎相同。如果这有用,请不要哦,任何人。。。