我在 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/