首页 > 解决方案 > dplyr::summarise 中的 R 用户定义/动态汇总函数

问题描述

如果听起来没有很多类似的问题,很难定义这个问题!

我有一个函数,我希望其中一个参数是函数名称,它将传递给 dplyr::summarise,例如“mean”或“sum”:

data(mtcars)
  f <- function(x = mtcars,
                groupcol = "cyl",
                zCol = "disp",
                zFun = "mean") {
    
    zColquo = quo_name(zCol)
    
    cellSummaries <- x %>%
      group_by(gear, !!sym(groupcol)) %>% # 1 preset grouper, 1 user-defined
      summarise(Count = n(), # 1 preset summary, 1 user defined
                !!zColquo := mean(!!sym(zColquo))) # mean should be zFun, user-defined
    ungroup
  }

(这按 gear 和 cyl 分组,然后返回,每组,count 和 mean(disp))

根据我的笔记,我希望“意思”是动态的,执行 zFun 定义的功能,但我一生都无法弄清楚如何去做!提前感谢您的任何建议。

标签: rfunctiondplyrnon-standard-evaluation

解决方案


您可以使用match.fun使函数动态化。我也删除zColquo了,因为它不需要。

library(dplyr)
library(rlang)

f <- function(x = mtcars,
              groupcol = "cyl",
              zCol = "disp",
              zFun = "mean") {

  cellSummaries <- x %>%
                   group_by(gear, !!sym(groupcol)) %>% 
                   summarise(Count = n(), 
                             !!zCol := match.fun(zFun)(!!sym(zCol))) %>%
                   ungroup

  return(cellSummaries)
}

然后您可以检查输出

f()

# A tibble: 8 x 4
#   gear   cyl Count  disp
#  <dbl> <dbl> <int> <dbl>
#1     3     4     1  120.
#2     3     6     2  242.
#3     3     8    12  358.
#4     4     4     8  103.
#5     4     6     4  164.
#6     5     4     2  108.
#7     5     6     1  145 
#8     5     8     2  326 

f(zFun = "sum")

# A tibble: 8 x 4
#   gear   cyl Count  disp
#  <dbl> <dbl> <int> <dbl>
#1     3     4     1  120.
#2     3     6     2  483 
#3     3     8    12 4291.
#4     4     4     8  821 
#5     4     6     4  655.
#6     5     4     2  215.
#7     5     6     1  145 
#8     5     8     2  652 

推荐阅读