按组计算列的平均值

3
我希望对于每个组,计算几列的平均值,但这些列应该作为名称向量给出:
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
您可以在这里这里查看相关编程内容,涉及数据表中使用动态列名和以变量形式使用列名。 - akrun
1个回答

3
我们可以使用.SDcols选择列mycols,并将.N与平均值连接起来。我们还需要使用lapply(.SD, mean)而不是colMeans(.SD),因为colMeans()没有被优化
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

我有其他列(除了 vw)不想包括在内。 - sds
@sds - 是的。这就是 .SDcols 的作用。它选择了 .SD 中的列。如果我们添加列 DT$z <- 21:25,然后运行上面的代码,我们可以看到结果中不会包括 z,也不会进行计算。 - Rich Scriven
将那个例子添加到我的答案中。 - Rich Scriven
谢谢 - .(N=.N)N=.N 有什么不同? - sds
谢谢;在这种情况下似乎不必要。 - sds
@sds - 哦,是的,你说得对。但在这种情况下不用考虑它 :) - Rich Scriven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接