【发布时间】:2015-04-01 22:22:18
【问题描述】:
我想使用dplyr将一个以编程方式选择的函数列表应用于数据框的每一列。为了便于说明,这里是我的函数列表:
fun_list <- lapply(iris[-5], function(x) if(var(x) > 0.7) median else mean)
我认为这会起作用:
iris %>% group_by(Species) %>% summarise_each_(funs_(fun_list), names(iris)[-5])
基于?funs_ 声明参数应该是,除其他外:
由...指定的函数列表 函数本身,意思是
但这失败并出现错误:
Error in UseMethod("as.lazy") :
no applicable method for 'as.lazy' applied to an object of class "function"
似乎funs_ 实际上期望的是与在适当环境中定义的函数相对应的符号列表,而不是实际函数。在我的应用程序中,虽然我只得到函数,而不是它们的符号名称(此外,函数很可能是匿名的)。
有没有办法通过dplyr 将实际函数传递给summarise_each?请注意,我正在专门寻找dplyr 的答案,因为我知道如何使用其他工具解决此问题。
【问题讨论】:
-
在这种情况下
~mean和~median可以工作。但它是一个公式(带有环境)而不是一个函数。您可以使用~sum(.)/length(.)之类的表达式来代替匿名函数。 -
@bergant,主要问题是我不控制函数,这些函数是作为函数提供给我的,所以我认为这与使用普通符号/调用具有相同的限制。不过,感谢您提醒我有关公式的信息。