R 聚合data.table中的多个列

R 聚合data.table中的多个列,r,dataframe,aggregate,data.table,R,Dataframe,Aggregate,Data.table,我有以下样本数据。表: dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10)) 这只是一个示例,我的表有许多列,因此我希望避免在函数名中指定所有列。我想在这种情况下,首先将数据转换为长格式,然后进行聚合是最快的方法(请参阅本文中的Matthew注释): 库(data.table) dtb这实际上是我一直在寻找的,并且在常见问题解答中提到: dtb[,lapply(.SD,mean),by="

我有以下样本
数据。表

dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10))

这只是一个示例,我的表有许多列,因此我希望避免在函数名中指定所有列。我想在这种情况下,首先将数据转换为长格式,然后进行聚合是最快的方法(请参阅本文中的Matthew注释):

库(data.table)

dtb这实际上是我一直在寻找的,并且在常见问题解答中提到:

dtb[,lapply(.SD,mean),by="id"]

这似乎效率很低。。没有办法只选择id一次而不是每个变量一次吗?我很困惑…你说的低效是什么意思?有太多的代码要写,还是太慢了?那么,只选择一次id而不是每个变量选择一次id是什么意思?你不是想要每个变量和id组合的总和吗?是的,没错。效率低下,我的意思是代码必须在数据帧中进行多少次搜索。除非我不了解R是如何做事情的,否则使用向量运算时,必须查找id一次,然后作为向量运算完成跨列求和。按照您建议的方式,每次都必须查找(id,variable)。在我的表中,我有大约200列,这将产生不同。不?+1这些,你完全正确,这绝对是更好的方式。我一直认为我应该把所有的东西都做成长格式,但是很多时候,就像在这种情况下,做计算更有效。您应该将自己的答案标记为正确答案。+1顺便说一句,此语法已在最新的v1.8.2中进行了优化。过去在
j
中使用
lappy
会造成速度损失,但现在不会了。对
数据进行了修订。表
wiki第1点已经完成,需要对第5点进行修订。
library(data.table)
dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10))
library(reshape2)
dt_long <- as.data.table(melt(dtb, id.var="id"))
dt_long[, sum(value), by=c("id","variable")]
    id variable  V1
 1:  1        a 601
 2:  2        a 440
 3:  3        a 496
 4:  4        a 553
 5:  5        a 444
 6:  6        a 466
 7:  7        a 525
 8:  8        a 553
 9:  9        a 541
...
dtb[,lapply(.SD,mean),by="id"]