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

标签 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”,“cyl”,m)。我为我的函数尝试了这段代码,但它也不起作用。

请有人帮助我纠正该功能。

最佳答案

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)

关于r - 将聚合函数转换为用户定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33893935/

相关文章:

自更新到 R 3.4.0 以来,C++11 的 Rcpp 插件不起作用

javascript - 我无法使 onmouseout 功能工作

javascript - 如何检查 JavaScript 函数是否返回 Promise?

xml - 使用 XSLT 对简单 XML 应用 Muenchian 分组

在共享 key 时将行 reshape 为列

r - 什么!运算符在R中表示平均值,尤其是在!! sym (“x”上下文中)

用周围环境值的平均值替换缺失值

c++ - 有条件地从 C++ 调用 Lua 函数

r - 计算 R 中值的数量

Python Pandas,从一列聚合多列