【问题标题】:Mean of list of coumns by group [duplicate]按组列出的列的平均值[重复]
【发布时间】:2015-08-20 02:53:45
【问题描述】:

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

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

不知道有没有办法...

【问题讨论】:

标签: r data.table


【解决方案1】:

我们可以将.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 不包含在结果中。这是因为它是使用.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 - 对。这就是.SDcols 的用途。它选择.SD 的列。如果我们添加列DT$z &lt;- 21:25,然后运行上面的代码,我们可以看到z不会包含在结果中,也不会包含在计算中
  • 将该示例添加到我的答案中
  • 谢谢 - .(N=.N)N=.N 有何不同?
  • 谢谢;不过在这种情况下,这似乎是不必要的。
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2016-01-10
  • 2015-11-02
相关资源
最近更新 更多