从索引中查找重复数据并将其串在一起

时间:2012-07-18 21:50:41

标签: r

使用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

谢谢!

4 个答案:

答案 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