【问题标题】:Use list of functions with dplyr::summarize_each_使用 dplyr::summarize_each_ 的函数列表
【发布时间】: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,主要问题是我不控制函数,这些函数是作为函数提供给我的,所以我认为这与使用普通符号/调用具有相同的限制。不过,感谢您提醒我有关公式的信息。

标签: r dplyr


【解决方案1】:

如果fun_list 是函数列表,您可以在将其用于 dplyr 函数之前将其转换为“惰性对象”列表

library(lazyeval)

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

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

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

更新

基于 cmets(每列有一个函数):

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))

【讨论】:

  • 有趣;我没有完全理解的一件事是summarize_each 将应用函数的每个排列 - 列,而不是一对一匹配。
  • 哦,我明白了。我认为这只是一个虚拟的例子。所以你需要更多类似 mutate_ 或 transmute_ 的东西,并提供由这些函数定义的值的名称-值对?
  • 不完全是,我需要对每一列 group 应用不同的汇总函数。请注意,您的答案实际上解决了我的问题(嗯,更像是用不同的问题替换),所以我可能会在以后接受这个,除非有人想出一些可以解决新问题的东西......
猜你喜欢
  • 2019-06-10
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2021-01-11
  • 2021-06-24
相关资源
最近更新 更多