在 R 中为摘要 dplyr 包传递参数

passing arguments for summaries dplyr package in R

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

的多项选择

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

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

你在找这样的东西吗?

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。将 enquo 替换为 ensym 并将 enquos 替换为 ensyms 也有效。