在R 的data.table中对两列及以上的列计算多种统计量
我有一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。