我试图通过创建和传递字符串作为 aggregate()函数的参数,在R“中动态调用聚合函数”。除了子参数之外,我几乎可以为所有参数做到这一点。
例如:我想运行以下代码: gg1< - aggregate(metric~grouping_var1 + grouping_var2,data = data.set,FUN =“mean”,subset = exclude.filter == 0)
我可以创建我可以传递给聚合函数的字符串变量:
current.metric <- "metric"
rhs <- c("grouping_var1","grouping_var2")
func1 <- "mean"
filter <- "exclude.filter == 0"
gg1 <- aggregate(as.formula(paste(current.metric, paste(rhs, collapse="+"), sep="~")), data=data.set, FUN= "mean", subset=exclude.filter==0)
只要提供subset = exclude.filter == 0作为参数,上面的代码就可以工作。我无法弄清楚如何使用subset = filter之类的东西。我尝试过表达式(filter),替换(filter),as.formula(filter)作为子参数中的参数,但我认为我没有在正确的环境中解析表达式。
另一种方法是构造整个字符串并将其传递给eval()。但是,我想知道它是否可以在聚合函数本身内完成。有人能指出我正确的方向来解决这个问题吗?
答案 0 :(得分:0)
更改为:
filt <- quote(exclude.filter == 0)
如果您需要传递值,则使用
然后尝试:
varname = "exclude.filter"
val = 0
filt <- substitute(var == value, list(var=as.name(varname),value=val))
gg1 <- aggregate(as.formula(paste(current.metric, paste(rhs, collapse="+"), sep="~")),
data=data.set, FUN= "mean", subset= eval(filt) )
答案 1 :(得分:0)
更好的答案是&#34;找到更好的方式&#34;但你仍然可以传递这样的字符串:
data.set <- mtcars
current.metric <- "mpg"
rhs <- c("vs","gear")
func1 <- "mean"
filt <- "am == 0"
aggregate(as.formula(paste(current.metric, paste(rhs, collapse="+"), sep="~")),
data=data.set, FUN= func1, subset = eval(parse(text = filt)))
# vs gear mpg
# 1 0 3 15.05000
# 2 1 3 20.33333
# 3 1 4 21.05000
aggregate(mpg ~ vs + gear, data = mtcars[mtcars$am == 0, ], FUN = mean)
# vs gear mpg
# 1 0 3 15.05000
# 2 1 3 20.33333
# 3 1 4 21.05000
## or
aggregate(mpg ~ vs + gear, data = mtcars, FUN = mean, subset = am == 0)
修改
这不是一个很好的例子,因为任务已经是单行,但你可以创建一个包装器函数来设置默认值,使键入更容易,消除错误等等。
agg <- function(data = mtcars, vars = 'mpg', by_vars = c('vs','gear'), FUN = mean, ...) {
aggregate(x = data[, vars], by = data[, by_vars], FUN = FUN, ...)
}
agg()
# vs gear mpg
# 1 0 3 15.05000
# 2 1 3 20.33333
# 3 0 4 21.00000
# 4 1 4 25.24000
# 5 0 5 19.12500
# 6 1 5 30.40000
agg(vars = c('mpg','disp'))
# vs gear mpg disp
# 1 0 3 15.05000 357.6167
# 2 1 3 20.33333 201.0333
# 3 0 4 21.00000 160.0000
# 4 1 4 25.24000 115.6200
# 5 0 5 19.12500 229.3250
# 6 1 5 30.40000 95.1000
agg(FUN = sum)
# vs gear mpg
# 1 0 3 180.6
# 2 1 3 61.0
# 3 0 4 42.0
# 4 1 4 252.4
# 5 0 5 76.5
# 6 1 5 30.4
agg(mtcars[mtcars$am == 0, ])
# vs gear mpg
# 1 0 3 15.05000
# 2 1 3 20.33333
# 3 1 4 21.05000
agg(by_vars = c('cyl','gear'))
# cyl gear mpg
# 1 4 3 21.500
# 2 6 3 19.750
# 3 8 3 15.050
# 4 4 4 26.925
# 5 6 4 19.750
# 6 4 5 28.200
# 7 6 5 19.700
# 8 8 5 15.400