如何在“subset”参数

时间:2016-01-19 22:18:20

标签: r

我试图通过创建和传递字符串作为 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()。但是,我想知道它是否可以在聚合函数本身内完成。有人能指出我正确的方向来解决这个问题吗?

2 个答案:

答案 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