2017-07-07 27 views
1

我有一個data.table,並希望在多個列上運行多個聚合,同時該表被分組到另一個變量上。我曾嘗試以下:組上多個變量的多個聚合

library(data.table) 

DT <- data.table(a = 1:10, 
       b = 10:1, 
       group = rep(1:2, each=5)) 

aggs <- function(x) list(mean = mean(x), sd = sd(x)) 

DT[, lapply(.SD, aggs), .(group), .SDcols = c('a', 'b')] 

這並不完全工作,因爲我要麼需要names()的列或輸出拆分成列 - 說a.meanb.mean等:

group  a  b 
1:  1  3  8 
2:  1 1.581139 1.581139 
3:  2  8  3 
4:  2 1.581139 1.581139 
+0

關於[這個答案](https://stackoverflow.com/questions/42163675/data-table-lapply-a-function-with-multicolumn-output#42164417) - 也許'熔化(DT ,id =「group」)[,Reduce(c,lapply(.SD,aggs)),「group,variable」]或dcast(melt(DT,id =「group」)[,Reduce(c,lapply (.SD,aggs)),「group,variable」],group_variable,value.var = c(「mean」,「sd」))'? – lukeA

+1

@lukeA我想沒有必要融化。類似於dcast(DT,group〜。,fun = list(mean,sd),value.var = c(「a」,「b」))「儘管沒有OP的首選col名稱。 – Frank

+0

轉換爲寬格式通常是一個壞主意,因爲使用結果數據集進行進一步分析實際上是不可能的。 –

回答

1

你接近,缺少一個額外的data.frame造型結果你想要的方式:給

DT[, data.frame(lapply(.SD, aggs)), by=group, .SDcols = c('a', 'b')] 

group a.mean  a.sd b.mean  b.sd 
1:  1  3 1.581139  8 1.581139 
2:  2  8 1.581139  3 1.581139