假设我有一个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
实现这一目标的最简单/最快方法是什么?
答案 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
。