首页 > 解决方案 > 在 R 中传递摘要 dplyr 包的参数

问题描述

我正在编写一个带有一些参数的函数summary_fn <- function(data,...,select_var,fun)。第一个参数是数据,第二个是group_by,第三个是变量,最后一个是多选summarise

有什么方法可以summarise用 eval(parse(text=exp)) 映射到函数中?或者无论如何会有帮助?

summary_fn <- function(data,...,select_var,fun){
  
  group <- ensyms(...)
  var <- ensym(select_var)
  
  name <- c()
  expr <- c()
  
  for( i in 1:length(fun)){
    exps  <- fun[[i]]
    exps  <- ensym(exps)
    name[[i]] <- paste0(quo_name(exps),"_", quo_name(var))
    expr[[i]] <- paste0(exps,"(",var,", na.rm = TRUE)")
  }
  
  print(name)
  print(expr)
  
  data %>% group_by(!!!group) %>% summarise(.......)
  
}

summary_fn(mtcars,cyl, am, select_var = mpg,fun = c("mean","max","min"))

标签: rdplyrtidyverserlang

解决方案


你在追求这样的事情吗?

library(tidyverse)

summary_fn <- function(data, ..., select_var, fun) {   
    group <- enquos(...)
    var <- enquo(select_var)   
    funs <- map(setNames(fun, fun), ~.x)   
    data %>% 
        group_by(!!!group) %>% 
        summarise(across(!!var, funs), .groups = "drop")  
}

summary_fn(mtcars, cyl, am, select_var = mpg, fun = c("mean", "max"))
## A tibble: 6 x 4
#    cyl    am mpg_mean mpg_max
#  <dbl> <dbl>    <dbl>   <dbl>
#1     4     0     22.9    24.4
#2     4     1     28.1    33.9
#3     6     0     19.1    21.4
#4     6     1     20.6    21  
#5     8     0     15.0    19.2
#6     8     1     15.4    15.8

如果您提供fun名称list,则可以跳过该funs <- map(...)步骤。

PS。替换enquoensymenquos可以ensyms


推荐阅读