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"]