【问题标题】:dplyr: Handing over multiple variables to group_by in a function [duplicate]dplyr:在函数中将多个变量移交给 group_by [重复]
【发布时间】:2019-11-26 20:28:19
【问题描述】:

我有一个dplyr::summarize 的函数。我怎样才能将多个变量交给它?

例子:

myfunction <- function(mydf, grp) {

  library(dplyr)

  grp <- enquo(grp)

  result <- mydf %>% 
    group_by(!! grp) %>% 
    summarise(sum = sum(x))

  result

}

# works
myfunction(df, grp1) 

# doesn't work
myfunction(df, c(grp1, grp2))

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    如果我们传递多个变量,将其作为字符串传递并使用group_by_at

    myfunction <- function(mydf, grp, xvar) {  
      mydf %>%       
        group_by_at(grp) %>%
        summarise(sum = sum({{xvar}}))
     }
    
    
    
    myfunction(mtcars, "am", mpg)
    # A tibble: 2 x 2
    #     am   sum
    #  <dbl> <dbl>
    #1     0  326.
    #2     1  317.
    myfunction(mtcars, c("am", "gear"), mpg)
    # A tibble: 4 x 3
    # Groups:   am [2]
    #     am  gear   sum
    #  <dbl> <dbl> <dbl>
    #1     0     3 242. 
    #2     0     4  84.2
    #3     1     4 210. 
    #4     1     5 107. 
    

    如果我们想要传递 OP 帖子中显示的组,一种方法是使用 enexpr 进行转换并评估 (!!!)

    myfunction <- function(mydf, grp, xvar) {  
       grp <- as.list(rlang::enexpr(grp))
       grp <- if(length(grp) > 1) grp[-1] else grp
    
       mydf %>%
            group_by(!!! grp) %>%
            summarise(sum = sum({{xvar}}))
    
     }
    
    myfunction(mtcars, am, mpg)
    # A tibble: 2 x 2
    #     am   sum
    #  <dbl> <dbl>
    #1     0  326.
    #2     1  317.
    myfunction(mtcars, c(am, gear), mpg)
    # A tibble: 4 x 3
    # Groups:   am [2]
    #     am  gear   sum
    #  <dbl> <dbl> <dbl>
    #1     0     3 242. 
    #2     0     4  84.2
    #3     1     4 210. 
    #4     1     5 107. 
    

    【讨论】:

      猜你喜欢
      • 2019-12-20
      • 2016-12-03
      • 2018-09-08
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多