我有以下樣品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