17

我有以下示例data.table

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

例如,我想通过 id 聚合所有列(a 和 b,尽管它们应该分开)colSums。这样做的正确方法是什么?以下不起作用:

 dtb[,colSums, by="id"]

这只是一个示例,我的表有很多列,所以我想避免在函数名称中指定所有列

4

2 回答 2

30

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

dtb[,lapply(.SD,mean),by="id"]
于 2012-07-29T23:27:47.697 回答
0

我想在这种情况下,首先将您的数据转换为长格式并接下来进行聚合是最快的(请参阅 Matthew 在这篇SO 帖子中的评论):

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
...
于 2012-07-28T06:50:13.547 回答