2012-07-27 61 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