按组

时间:2015-08-20 02:53:46

标签: r data.table

我想计算每个组的几列的平均值,但列应该作为名称向量给出:

library(data.table)
DT <- data.table(k=c(1,1,2,2,2),v=1:5,w=11:15,key="k")
DT[,list(N=.N,v=mean(v),w=mean(w)),by="k"]
   k N   v    w
1: 1 2 1.5 11.5
2: 2 3 4.0 14.0

但是,我不希望在计算方法时明确指定vw。 我有另一个变量

mycols <- c("v","w")
应该使用

而不是显式列名。

我尝试了各种版本的

DT[,list(.N,colMeans(.SD[mycols])),by="k"]

得到了

Error in `[.data.table`(.SD, mycols) :

我想知道是否有办法做到这一点......

1 个答案:

答案 0 :(得分:3)

我们可以使用.N连接.SDcols来选择列mycols。我们还希望使用lapply(.SD, mean)代替colMeans(.SD)colMeans()not optimized

DT[, c(N = .N, lapply(.SD, mean)), by = k, .SDcols = mycols]
#    k N   v    w
# 1: 1 2 1.5 11.5
# 2: 2 3 4.0 14.0

另一个例子是,如果我们只想"v",我们会使用mycols[1]

DT[, c(N = .N, lapply(.SD, mean)), by = k, .SDcols = mycols[1]]
#    k N   v
# 1: 1 2 1.5
# 2: 2 3 4.0

为了进一步说明,如果我们添加列z然后从上面运行相同的代码,那么我们会看到z未包含在结果中。这是因为它已使用.SD.SDcols = mycols移除。

DT[, z := 21:25]
DT[, c(N = .N, lapply(.SD, mean)), by = k, .SDcols = mycols]
#    k N   v    w
# 1: 1 2 1.5 11.5
# 2: 2 3 4.0 14.0