将聚合函数转换为用户定义的函数

时间:2015-11-24 12:38:21

标签: r function aggregate user-defined-functions sqldf

我在R中创建了一个数据集,如下所示:

m <- mtcars
m$dep<- ifelse(m$mpg <=16,1,0)

现在,如果我尝试按照基于cyl

完成的组对变量dep求和
a <-aggregate(dep_var~ cyl, FUN=sum, data=m)
a

我得到了理想的结果。但是,我的问题是如果我尝试将其转换为用户定义的函数来自动化它,我收到一个错误。我尝试了以下代码:

f<- function(target,variable,data){
  a <-aggregate(target ~ variable, FUN=sum, data=data)
  return(a)
}
f(dep,cyl,m)

请你在这方面帮助我。 你能告诉我在调用函数时应该何时使用双引号?例如。 F( “DEP”, “缸”,M)。我为我的功能尝试了这个代码,但它也没有用。

请一些人帮我纠正这个功能。

2 个答案:

答案 0 :(得分:3)

1)在这种情况下,更容易使用公式界面。首先将目标和变量名称作为字符串,然后运行aggregate

f1 <- function(target, variable, data) {
  target <- deparse(substitute(target))
  variable <- deparse(substitute(variable))
  aggregate(data[target], data[variable], sum)
}
f1(dep, cyl, m)

,并提供:

  cyl dep
1   4   0
2   6   0
3   8  10

2)如果你想直接将列名作为字符串传递,而不是像我们上面那样将未评估的表达式传递给那么它就更容易并提供相同的输出:

f2 <- function(target, variable, data) {
  aggregate(data[target], data[variable], sum)
}
f2("dep", "cyl", m)

3)虽然问题是aggregate解决方案,但它上面有一个sqldf标记,所以万一你想要一个sqldf解决方案,其中一个是名称通过。如果您想传递未评估的表达式,请使用与(1)中deparse(substitute(...))

相同的方法
library(sqldf)
f3 <- function(target, variable, data) {
    fn$sqldf("select $variable, sum($target) from data group by $variable")
}
f3("dep", "cyl", m)

答案 1 :(得分:1)

您需要在函数中添加as.formula。这应该可以获得所需的输出。

f <- function(target,variable,data){
  a <- aggregate(as.formula(paste(target,variable,sep=" ~ ")), FUN = sum, data = data)
  return(a)
}

f("dep","cyl",m)
> f("dep","cyl",m)
  cyl dep
1   4   0
2   6   0
3   8  10