2016-12-02 115 views
0

我想結合使用j的.SD lapply的結果與j.的其他輸出列我怎樣才能在同一個數據表中做到這一點? 到目前爲止,我創建兩個數據表(example_summary1, example_summary2)併合並他們,但應該有更好的方法? 也許我不完全理解的.SD/.SDcols.R數據表將lapply與其他j參數結合起來

example <-data.table(id=rep(1:5,3),numbers=rep(1:5,3),sample1=sample(20,15,repla ce=TRUE),sample2=sample(20,15,replace=100)) 

    id numbers sample1 sample2 
1: 1  1  17  18 
2: 2  2  8  1 
3: 3  3  17  12 
4: 4  4  15  2 
5: 5  5  14  18 
6: 1  1  11  14 
7: 2  2  12  12 
8: 3  3  11  7 
9: 4  4  16  13 
10: 5  5  17  1 
11: 1  1  10  3 
12: 2  2  14  15 
13: 3  3  13  3 
14: 4  4  17  6 
15: 5  5  1  5 


example_summary1<-example[,lapply(.SD,mean),by=id,.SDcols=c("sample1","sample2")] 

     > example_summary1 
    id sample1 sample2 
1: 1 12.66667 11.666667 
2: 2 11.33333 9.333333 
3: 3 13.66667 7.333333 
4: 4 16.00000 7.000000 
5: 5 10.66667 8.000000 


example_summary2<-example[,.(example.sum=sum(numbers)),id] 

> example_summary2 
    id example.sum 
1: 1   3 
2: 2   6 
3: 3   9 
4: 4   12 
5: 5   15 
+0

你有多少列? – Sotos

+0

在我的真實數據中,我有大約42列,我想用'.SDcols'和一些其他列來處理我想包含到j輸出列表中的列。 – Cracker

+0

這些列會干擾'SDcols'之外的其他列。我不確定這是可能的,還是我只能使用'SDcols'? – Cracker

回答

2

這是最好的,你可以做的概念,如果你正在使用.SDcols

example_summary1 <- example[, c(lapply(.SD, mean), .(example.sum = sum(numbers))), 
          by = id, .SDcols = c("sample1", "sample2", "numbers")][, numbers := NULL][] 

如果你不.SDcols包括numbers它不是在j中可用。

沒有.SDcols你可以這樣做:

example_summary1 <- example[, c(lapply(.(sample1 = sample1, sample2 = sample2), mean), 
           .(example.sum = sum(numbers))), 
          by=id] 

或者,如果你有列名的載體:

cols <- c("sample1","sample2") 
example_summary1 <- example[, c(lapply(mget(cols), mean), 
           .(example.sum = sum(numbers))), 
          by=id] 

但我懷疑,你沒有得到同樣的data.table優化然後。

最後,data.table連接速度非常快,以至於我會使用您的方法。

+0

感謝您的快速回答。我不想手動編寫所有SDcols,所以後面的那個不是一個選項。但第一個看起來很有希望。 我一直認爲'.SDcols'只會干擾'.SD'。這個限制有點不直觀。 – Cracker

+0

'.SD'是j中所有可用列的data.table。 – Roland

+0

如果您有一個列名稱向量,請參閱我的編輯選項。 – Roland

相關問題