【问题标题】:aggregation of column over list of grouping variables在分组变量列表上聚合列
【发布时间】:2017-11-02 11:06:35
【问题描述】:

假设有一个data.table,其 ID 为 1,2 和 3,还有一个 VALUE 列。还有一个这些 ID 的排列列表,这些 ID 定义了我要为其计算统计数据的子集。例如。计算 {1 ,2}、{2 和 3}、{1 和 3} 中三个组 ID 的 VALUE 平均值:

library(data.table)
DT <- data.table(ID = c(1,1,2,2,3,3),VALUE = c(1,2,10,20,100,200))
permutations <- list(c(1,2),c(2,3),c(1,3))

如何生成所需的输出

permutation MEAN
    1        8.25
    2        82.5
    3        75.75

我的没有循环或apply 的伪代码看起来像这样,但它当然不起作用:

DT[,.(MEAN = mean(VALUE)),by = .(ID %in% permutations)]

是否可以在没有循环或调用应用的情况下做到这一点?我的桌子需要很长时间。

【问题讨论】:

  • 试试DT[stack(setNames(permutations, seq_along(permutations))), on = .(ID = values)][, .(MEAN = mean(VALUE)), by = .(permutation = ind)]
  • @akrun 我认为这是最好的方式,值得发帖。

标签: r data.table apply


【解决方案1】:

基本的 R 方法是,

sapply(permutations, function(i) {x <- DT[DT$ID %in% i]; mean(x$VALUE)})
#[1]  8.25 82.50 75.75

【讨论】:

  • DT[cond] 不能在基地工作。我认为有效的方法是mean(DT$VALUE[cond])
【解决方案2】:

我们可以在将它转换为“data.frame”后将“data.table”与“permutations”进行连接,然后通过mean进行分组

DT[stack(setNames(permutations, seq_along(permutations))), 
     on = .(ID = values)][, .(MEAN = mean(VALUE)), by = .(permutation = ind)] 
#   permutation  MEAN
#1:           1  8.25
#2:           2 82.50
#3:           3 75.75

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2014-05-29
    • 2023-01-04
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多