使用 dplyr::summarize_each_ 的函数列表

Use list of functions with dplyr::summarize_each_

我想使用 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_ 声明参数应该是:

A list of functions specified by ... The function itself, mean

但这失败并出现错误:

Error in UseMethod("as.lazy") : 
  no applicable method for 'as.lazy' applied to an object of class "function"

似乎 funs_ 实际上需要一个与在适当环境中定义的函数相对应的符号列表,而不是实际函数。在我的应用程序中,虽然我只得到函数,而不是它们的符号名称(此外,函数很可能是匿名的)。

有没有办法通过 dplyr 将实际函数传递给 summarise_each?请注意,我正在寻找 dplyr 答案,因为我知道如何使用其他工具解决此问题。

如果fun_list是一个函数列表,你可以在dplyr函数中使用它之前将其转换为"lazy objects"的列表。

library(lazyeval)

fun_list2 <- lapply(fun_list, function(f) lazy(f(.)))

fun_list2 <- lapply(fun_list, function(f) lazy_(quote(f), env = environment()))

但是我不确定这是不是100%防水的方法

更新

基于评论(每列一个函数):

dispatch <- lazy_(quote((fun_list[[as.character(substitute(.))]](.))), env = environment())

iris %>% group_by(Species) %>% summarise_each_(funs_(dispatch), names(iris)[-5])

我们的想法是使用 summarise_each_ 但不是使用函数列表而是使用 单个 dispatch 函数。这个函数接受一个变量,找到正确的 来自原始 fun_list 的函数(按其名称!)并使用变量作为输入。

如果函数列表的名称匹配,则该解决方案有效 变量的名称。

也可以动态定义调度和函数列表(在这种情况下 环境不是全球性的):

get_dispatch <- function(fun_list) {
    return(lazy_(quote((fun_list[[as.character(substitute(.))]](.))), env = environment())) 
}

dispatch <- get_dispatch(lapply(iris[-5], function(x) if(var(x) > 0.7) median else mean))