1

使用 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
1    1       a
2    2    b||c
3    3       d
4    4 e||f||g
5    5       h

谢谢!

4

4 回答 4

4

略有不同,相当精简,并且在基础:

y <- split(df$value, df$meta)
data.frame(meta=names(y), value=sapply(y, paste, collapse="||"))

甚至更简单:

aggregate(value~meta, df, paste, collapse="||")
于 2012-07-18T23:08:56.413 回答
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

如果你想保留名字

于 2012-07-18T21:56:38.513 回答
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
于 2012-07-18T22:09:38.653 回答
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
于 2012-07-19T06:57:30.380 回答