gpt4 book ai didi

r - 将函数列表与 dplyr::summarize_each_ 一起使用

转载 作者:行者123 更新时间:2023-12-01 17:32:43 25 4
gpt4 key购买 nike

我想使用 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 函数中使用它之前将其转换为“惰性对象”列表

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_ 但不是使用函数列表,而是使用单一调度功能。该函数接受一个变量,找到正确的来自原始 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))

关于r - 将函数列表与 dplyr::summarize_each_ 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29401907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com