我有以下样品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"]
这仅仅是一个样品,我的表中有很多列,所以我想避免指定函数名
我有以下样品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"]
这仅仅是一个样品,我的表中有很多列,所以我想避免指定函数名
这其实就是我一直在寻找,并在常见问题中提到:
dtb[,lapply(.SD,mean),by="id"]
我在这种情况下,想所有的人都为它最快首先把你的数据为长格式,然后进行下一步的聚合(见马太福音在这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
...
这似乎是非常低效..有没有办法只选择ID的一次,而每一次变化? – Alex 2012-07-29 04:10:48
我很困惑......你是什么意思,效率低下?有太多的代码要写或它太慢?你是什么意思只选择一次id而不是每个变量一次?你不是想要每个变量和id组合的总和吗? – 2012-07-29 07:59:34
是的,没错。效率低下,我的意思是代码必须做多少次搜索。除非我不了解R是如何处理的基础,在向量操作中,id必须被查找一次,然后跨列的和作为矢量操作完成。在你提出的方式中,(id,变量)必须每次查找。在我的桌子上,我有大约200列,这将有所作为。没有? – Alex 2012-07-29 21:27:37
+1这些,你是完全正确的,这绝对是更好的方法。我总是认为我应该拥有所有格式很长的东西,但是经常这样做,因为计算效率更高。你应该把你的标记作为正确的答案。 – 2012-07-30 13:29:27
好听起来不错,我会改变这个正确的答案。 – Alex 2012-07-30 14:48:31
+1顺便说一句,这个语法已经在最新的v1.8.2中进行了优化。过去有一种在'j'中使用'lapply'的速度惩罚,但不再是这样。对'data.table'维基点1的修改已经完成,并且需要对点5进行修改。 – 2012-08-08 15:50:42