聚合data.frame中的行

时间:2014-09-12 21:53:56

标签: r dataframe

假设我有一个data.frame,例如:

df = data.frame(id = c("a","b","c","d","e"), tid = rep("t",5), gid = c("A","B","C","D","E"), V1 = c("11","11","11","00","11"), V2 = c("11","01","11","01","01"), V3 = c("11","11","11","10","11"))

我希望聚合4-6列之间相同的行(除了前三列之外的所有列)。与聚合行对应的前三个列字段应为其原始值的串联(逗号分隔)。

因此,对于我的示例,这将是生成的data,frame

> df
   id tid gid V1 V2 V3
1 a,c   t A,C 11 11 11
2 b,e   t B,E 11 01 11
3   d   t   D 00 01 10

实现这一目标的最简单/最快方法是什么?

2 个答案:

答案 0 :(得分:3)

如果要将值向量折叠为逗号分隔列表,则作业的最佳函数为paste(),如果将其与基本aggregate()函数组合,则得到

aggregate(id~., df, paste,collapse=",")

返回所需的输出。

使用已编辑的问题版本,您可以使用

aggregate(as.matrix(cbind.data.frame(id,tid,gid))~., df, paste,collapse=",")

如果要聚合的列是字符而不是因子,那么您可以完成

aggregate(cbind(id,tid,gid)~., df, paste,collapse=",")

答案 1 :(得分:1)

你在问题​​中提到“有效”。然后我会建议查看data.table。此外,目前尚不清楚您是否需要unique,因此我已使用unique显示我的答案,因为它符合您所需的输出:

library(data.table)
setDT(df)[, lapply(.SD, function(x) paste(unique(x), collapse = ",")), 
          by = list(V1, V2, V3)]
#    V1 V2 V3  id tid gid
# 1: 11 11 11 a,c   t A,C
# 2: 11 01 11 b,e   t B,E
# 3: 00 01 10   d   t   D

请注意,结果为data.table,原始data.frame也已转换为data.table