在R 的data.table中对两列及以上的列计算多种统计量

编程语言 2026-07-10

我有一个R data.table,其中每个分组变量 class 都有若干观测值。我想对某些列(变量)按 class 计算一些统计量(最小值、最大值)。

因此我在尝试使用一个返回 list 的函数,并同时返回 lapply()。我原本期望每个变量/统计量对应一列,但不同的统计量都放在同一列里。我大概可以用 dcast 来修正这个问题。但我在想是否有更好的 data.table 方式来实现。

下面给出一个可重现的示例(reprex):

dt <- data.table(class = rep(c('a', 'b', 'c'), 4),
                 val1 = sample(12),
                 val2 = sample(12)*10)

stats <- function(x) {
    list(
        maximo = max(x),
        minimo = min(x)
    )
}

dt[,
   lapply(.SD, stats),
   by = class,
   .SDcols = c('val1', 'val2')]

输出结果是:

    class  val1  val2
   <char> <int> <num>
1:      a    11   120
2:      a     1    40
3:      b    12    90
4:      b     5    10
5:      c     7   100
6:      c     2    20

我的期望是:

    class  val1_maximo va1_minimo val2_maximo val2_minimo
1:      a      11        1          120          40
2:      b      12        5           90          10  
3:      c       7        2          100          20

解决方案

stats() 对所有 .SDcols 返回一个扁平的列表(没有嵌套)。

stats <- function(DT) {
    lapply(DT, \(x) list(maximo = max(x), minimo = min(x))) |>
        unlist(recursive = FALSE) # same as do.call(c, args = _)
}

dt[, stats(.SD), by = class, .SDcols = c('val1', 'val2')]

#    class val1.maximo val1.minimo val2.maximo val2.minimo
#    <char>       <num>       <num>       <num>       <num>
# 1:      a          12           4          90          10
# 2:      b           9           5         120          60
# 3:      c          11           1         100          30
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章