我想计算每个组的几列的平均值,但列应该作为名称向量给出:
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
但是,我不希望在计算方法时明确指定v
和w
。
我有另一个变量
mycols <- c("v","w")
应该使用而不是显式列名。
我尝试了各种版本的
DT[,list(.N,colMeans(.SD[mycols])),by="k"]
得到了
Error in `[.data.table`(.SD, mycols) :
我想知道是否有办法做到这一点......
答案 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