[英]Aggregating rows in a data.frame
假设我有一个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
最简单/最快的方法是什么?
如果要将值向量折叠到用逗号分隔的列表中,则该工作的最佳功能是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=",")
您在问题中提到“有效”。 然后,我建议查看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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.