gpt4 book ai didi

r - 使用 lapply(.SD, ...) 计算多个变量的多个聚合

转载 作者:行者123 更新时间:2023-12-04 16:27:16 30 4
gpt4 key购买 nike

我想执行多个聚合,使用 data.tablelapply(.SD, ...)方法,即计算几个变量的几个不同的汇总统计量。但是我对如何以错误或等效于 rbind 的方式做到这一点的猜测而不是 cbind .
例如,要通过 cyl 获得 mtcars 中的均值和中值 mpg,可以执行以下操作:

mtcars.dt <- data.table(mtcars)
mtcars.dt[, list(mpg.mean = mean(mpg), mpg.median = median(mpg)), by = "cyl"]
# Result:
cyl mpg.mean mpg.median
|1: 6 19.74 19.7
|2: 4 26.66 26.0
|3: 8 15.10 15.2
但应用 .SD接近 rbind s 函数的结果:
mtcars.dt[, lapply(.SD, function(x) list(mean(x), median(x))),
by = "cyl", .SDcols = c("mpg")]
# Result:
cyl mpg
1: 6 19.7428571428571
2: 6 19.7
3: 4 26.6636363636364
4: 4 26
5: 8 15.1
6: 8 15.2
或者完全中断:
mtcars.dt[, lapply(.SD, list(mean, median)),
by = "cyl", .SDcols = c("mpg")]
# Result:
# Error in `[.data.table`(mtcars.dt, , lapply(.SD, list(mean, median)), :
# attempt to apply non-function
编辑:正如 Senor O 所指出的,一些答案为我的示例提供了工作,但这只是因为有一个聚合列。理想的解决方案适用于多列,例如替换以下内容:
mtcars.dt[, list(mpg.mean = mean(mpg), mpg.median = median(mpg), 
hp.mean = mean(hp), hp.median = median(hp)), by = "cyl"]
# Result:
cyl mpg.mean mpg.median hp.mean hp.median
1: 6 19.74 19.7 122.29 110.0
2: 4 26.66 26.0 82.64 91.0
3: 8 15.10 15.2 209.21 192.5
但是,即使它适用于单个列,它仍然很有用。例如,我的直接用例是一个函数,它将列名作为字符串并为其计算多个分组指标,这在没有 .SDcols 的情况下是不可能的。 AFAIK。

最佳答案

您缺少一个 [[1]]$mpg :

mtcars.dt[, lapply(.SD, function(x) list(mean(x), median(x)))[[1]],
by="cyl", .SDcols=c("mpg")]
#or
mtcars.dt[, lapply(.SD, function(x) list(mean(x), median(x)))$mpg,
by="cyl", .SDcols=c("mpg")]
# cyl V1 V2
#1: 6 19.74286 19.7
#2: 4 26.66364 26.0
#3: 8 15.10000 15.2

对于更一般的情况,请尝试:
mtcars.dt[, as.list(unlist(lapply(.SD, function(x) list(mean=mean(x),
median=median(x))))),
by="cyl", .SDcols=c("mpg", "hp")]
# cyl mpg.mean mpg.median hp.mean hp.median
# 1: 6 19.74 19.7 122.29 110.0
# 2: 4 26.66 26.0 82.64 91.0
# 3: 8 15.10 15.2 209.21 192.5

(或 as.list(sapply(.SD, ...)))

关于r - 使用 lapply(.SD, ...) 计算多个变量的多个聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24151602/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com