按组列列表的平均值
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
但是,我不想在计算均值时明确指定v
和w
。
我还有另一个变量
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
我想为每组计算几列的平均值,但这些列应作为名称向量给出:
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) :
不知道有没有什么办法...
我们可以使用 .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