使用R,如果我有一个2列数据框:
meta <- c(1,2,2,3,4,4,4,5)
value <- c("a","b","c","d","e","f","g","h")
df <- data.frame(meta,value)
df
meta value
1 1 a
2 2 b
3 2 c
4 3 d
5 4 e
6 4 f
7 4 g
8 5 h
如何通过重复的“meta”将“value”与分隔符(如||)组合,以便生成的数据框看起来像:
meta value
1 1 a
2 2 b||c
3 3 d
4 4 e||f||g
5 5 h
谢谢!
答案 0 :(得分:4)
略有不同,相当精益,基础:
y <- split(df$value, df$meta)
data.frame(meta=names(y), value=sapply(y, paste, collapse="||"))
甚至更简单:
aggregate(value~meta, df, paste, collapse="||")
答案 1 :(得分:2)
使用plyr
包以下作品
library(plyr)
> ldply(split(df,meta),function(x){paste(x$value,collapse="||")})
.id V1
1 1 a
2 2 b||c
3 3 d
4 4 e||f||g
5 5 h
或
> ddply(df,.(meta),function(x){c(value=paste(x$value,collapse="||"))})
meta value
1 1 a
2 2 b||c
3 3 d
4 4 e||f||g
5 5 h
如果你想保留名字
答案 2 :(得分:2)
我希望你不要不喜欢一个衬垫:data.frame(meta = unique(df $ meta),value = sapply(unique(df $ meta),function(m){paste(df $ value [which( df $ meta == m)],collapse =“||”)}))
> data.frame(meta=unique(df$meta), value=sapply(unique(df$meta), function(m){ paste(df$value[which(df$meta==m)],collapse="||") }) )
meta value
1 1 a
2 2 b||c
3 3 d
4 4 e||f||g
5 5 h
答案 3 :(得分:0)
这是另一种方式......
uni.meta <- unique(df$meta)
list <- lapply(1:length(uni.meta),function(x) which(df$meta==uni.meta[x]))
new.value <- unlist(lapply(1:length(list),function(x) paste(df$value[list[[x]]],collapse="||")))
new.df <- data.frame(uni.meta,new.value)
new.df
uni.meta new.value
1 1 a
2 2 b||c
3 3 d
4 4 e||f||g
5 5 h