繁体   English   中英

聚合data.frame中的行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM