按组列列表的平均值

Mean of list of coumns by group

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

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) :

不知道有没有什么办法...

我们可以使用 .SDcols 连接 .N 来选择列 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 不包含在结果中。这是因为它是使用 .SDcols = mycols.

.SD 中删除的
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