2012-07-27 54 views
12

我有以下样品data.table聚集在多列data.table

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

我想聚集所有列(a和b,尽管它们应当分开)按id使用colSums,例如。什么是正确的方法来做到这一点?以下不工作:

dtb[,colSums, by="id"] 

这仅仅是一个样品,我的表中有很多列,所以我想避免指定函数名

回答

24

这其实就是我一直在寻找,并在常见问题中提到:

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

+1这些,你是完全正确的,这绝对是更好的方法。我总是认为我应该拥有所有格式很长的东西,但是经常这样做,因为计算效率更高。你应该把你的标记作为正确的答案。 – 2012-07-30 13:29:27

+0

好听起来不错,我会改变这个正确的答案。 – Alex 2012-07-30 14:48:31

+0

+1顺便说一句,这个语法已经在最新的v1.8.2中进行了优化。过去有一种在'j'中使用'lapply'的速度惩罚,但不再是这样。对'data.table'维基点1的修改已经完成,并且需要对点5进行修改。 – 2012-08-08 15:50:42

0

我在这种情况下,想所有的人都为它最快首先把你的数据为长格式,然后进行下一步的聚合(见马太福音在这SO post评论):

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 
... 
+0

这似乎是非常低效..有没有办法只选择ID的一次,而每一次变化? – Alex 2012-07-29 04:10:48

+0

我很困惑......你是什么意思,效率低下?有太多的代码要写或它太慢?你是什​​么意思只选择一次id而不是每个变量一次?你不是想要每个变量和id组合的总和吗? – 2012-07-29 07:59:34

+0

是的,没错。效率低下,我的意思是代码必须做多少次搜索。除非我不了解R是如何处理的基础,在向量操作中,id必须被查找一次,然后跨列的和作为矢量操作完成。在你提出的方式中,(id,变量)必须每次查找。在我的桌子上,我有大约200列,这将有所作为。没有? – Alex 2012-07-29 21:27:37