Search code examples
rdplyrgroupingellipsis

How to avoid ellipsis ... in dplyr?


I want to create a function that takes a grouping argument. Which can be a single or multiple variables. I want it to look like this:

wanted <- function(data, groups, other_params){
  data %>% group_by( {{groups}} ) %>% count()
}

This work only when a single group is given but breaks when there are multiple groups. I know it's possible to use the following with ellipsis ... (But I want the syntax groups = something):

not_wanted <- function(data, ..., other_params){
  data %>% group_by( ... ) %>% count()
}

Here is the entire code:

library(dplyr)
library(magrittr)

iris$group2 <- rep(1:5, 30)

wanted <- function(data, groups, other_params){
  data %>% group_by( {{groups}} ) %>% count()
}

not_wanted <- function(data, ..., other_params){
  data %>% group_by( ... ) %>% count()
}

# works
wanted(iris, groups = Species )
not_wanted(iris, Species, group2)

# doesn't work
wanted(iris, groups = vars(Species, group2) )
wanted(iris, groups = c(Species, group2) )
wanted(iris, groups = vars("Species", "group2") )
#  Error: Column `vars(Species, group2)` must be length 150 (the number of rows) or one, not 2


Solution

  • You guys are over complicating things, this works just fine:

    library(tidyverse)
    
    wanted <- function(data, groups){
      data %>%  count(!!!groups)
    }
    
    mtcars %>% wanted(groups = vars(mpg,disp,hp))
    
    # A tibble: 31 x 4
         mpg  disp    hp     n
       <dbl> <dbl> <dbl> <int>
     1  10.4  460    215     1
     2  10.4  472    205     1
     3  13.3  350    245     1
     4  14.3  360    245     1
     5  14.7  440    230     1
     6  15    301    335     1
     7  15.2  276.   180     1
     8  15.2  304    150     1
     9  15.5  318    150     1
    10  15.8  351    264     1
    # … with 21 more rows