使用 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))
我想使用 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))