gpt4 book ai didi

r - 使用 dot dot dot (...) 表示从自定义函数返回的列,用于 data.table 对象

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

我想用...指示我想从 data.table 的自定义函数返回的变量目的。这是一个最小的可复制示例:

library(data.table)
d = data.table(mtcars)

getvar = function(...){
return(d[,.(xyz = mean(hp), ...), cyl])
}

getvar(mpg, cyl, disp)

Error in [.data.table(d, , .(N = .N, ...), cyl) : object 'cyl' not found



我希望得到的是:
d[,.(xyz = mean(hp), mpg, cyl, disp), cyl]

# cyl xyz mpg cyl disp
# 1: 6 122.28571 21.0 6 160.0
# 2: 6 122.28571 21.0 6 160.0
# 3: 6 122.28571 21.4 6 258.0
# 4: 6 122.28571 18.1 6 225.0
# 5: 6 122.28571 19.2 6 167.6

任何人都可以分享他们的解决方案吗?

最佳答案

一个可能的解决方案是使用 mget在您的函数中返回一个列表,然后组合 xyzc .您要添加的列需要指定为字符向量才能完成此操作:

getvar = function(...){
return(d[, c(xyz = mean(hp), mget(...)), cyl])
}

getvar(c("mpg", "cyl", "disp"))

这使:

> getvar(c("mpg", "cyl", "disp"))
cyl xyz mpg cyl disp
1: 6 122.28571 21.0 6 160.0
2: 6 122.28571 21.0 6 160.0
3: 6 122.28571 21.4 6 258.0
4: 6 122.28571 18.1 6 225.0
5: 6 122.28571 19.2 6 167.6
6: 6 122.28571 17.8 6 167.6
7: 6 122.28571 19.7 6 145.0
8: 4 82.63636 22.8 4 108.0
9: 4 82.63636 24.4 4 146.7
10: 4 82.63636 22.8 4 140.8
....


或者作为替代, @Rhonak's answer 的轻微变化(感谢@zx8754):
getvar = function(...){
mc <- match.call(expand.dots = FALSE)
x <- as.character(mc$...)
d[, c(xyz = mean(hp), mget(x)), cyl]
}

getvar(mpg, cyl, disp)

关于r - 使用 dot dot dot (...) 表示从自定义函数返回的列,用于 data.table 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58706282/

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