gpt4 book ai didi

r - 以编程方式在 data.table 中使用 by 对列进行操作

转载 作者:行者123 更新时间:2023-12-04 11:19:22 24 4
gpt4 key购买 nike

我想在 by 中使用包含列名的字符向量在 data.table以及定义组的交互方式。该向量包含在少数 data.table 中通用的列s,但每个 data.table有几个独特的列。那可能吗?下面举例。

library(data.table)
mtcarsdt <- data.table(mtcars)
bycols <- c('cyl', 'gear') # Defined for use across multiple data.tables
mtcarsdt[
, .(mpg = mean(mpg)), # This does not work.
by = c('carb%%2', bycols) # How can I make this work?
]
mtcarsdt[
, .(mpg = mean(mpg)),
by = .(carb%%2, cyl, gear) # This works
]

最佳答案

这是一种非常直接的方法:

mtcarsdt[, .(mpg = mean(mpg)), by = eval(as.call(parse(text = c(".", bycols, "carb %% 2"))))]
# cyl gear carb mpg
# 1: 6 4 0 19.75000
# 2: 4 4 1 29.10000
# 3: 6 3 1 19.75000
# 4: 8 3 0 14.63333
# 5: 4 4 0 24.75000
# 6: 8 3 1 16.30000
# 7: 4 3 1 21.50000
# 8: 4 5 0 28.20000
# 9: 8 5 0 15.40000
#10: 6 5 0 19.70000

另一种选择是构建整个表达式并对其进行评估/解析:
bycols = "cyl, gear"
eval(parse(text = paste0('mtcarsdt[, .(mpg = mean(mpg)), by = .(carb %% 2, ', bycols, ')]')))

您也可以使用 eval 玩相同的技巧。/ quote .

如果你不在乎保留 bycols列作为列,并且主要关心分组,您还可以执行以下操作:
mtcarsdt[, byvals := paste(.BY, collapse = ","), by = bycols][
, .(mpg = mean(mpg)), by = .(byvals, carb %% 2)]
# byvals carb mpg
# 1: 6,4 0 19.75000
# 2: 4,4 1 29.10000
# 3: 6,3 1 19.75000
# 4: 8,3 0 14.63333
# 5: 4,4 0 24.75000
# 6: 8,3 1 16.30000
# 7: 4,3 1 21.50000
# 8: 4,5 0 28.20000
# 9: 8,5 0 15.40000
#10: 6,5 0 19.70000

关于r - 以编程方式在 data.table 中使用 by 对列进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935886/

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