【问题标题】:passing arguments for summaries dplyr package in R在 R 中传递摘要 dplyr 包的参数
【发布时间】:2021-05-05 05:01:47
【问题描述】:

我正在编写一个带有一些参数summary_fn <- function(data,...,select_var,fun) 的函数。第一个参数是data,第二个是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"))

【问题讨论】:

    标签: r dplyr tidyverse rlang


    【解决方案1】:

    你在追求这样的事情吗?

    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 &lt;- map(...) 步骤。

    PS。将enquo 替换为ensym 并将enquos 替换为ensyms 也可以。

    【讨论】:

    • cross() 不起作用,我尝试更新 dplyr
    • 嗨@Ben。你是什​​么意思它不起作用?我这边没有错误。 acrossdplyr_1.0.0 中引入;您的意思是说您运行的是较旧的dplyr 版本并且无法升级?
    • 附言。您可以使用旧的作用域动词 summarise_at 实现相同的效果,但不鼓励这样做,因为所有作用域动词都已被取代(由于 across)。
    • 调用 funs 时如何设置 na,rm = TRUE?
    • 我得到了分位数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2023-04-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多