2017-07-07 53 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