2

I have two functions that evaluate ellipses arguments as column names. These functions (sub_fun_1 and sub_fun_2) use these column names to group the inputted data-frames.

main_fun <- function(df1, df2, ...) {

columns <- enquos(...) ### '...' arguments used to specify columns in data-sets

df1_grouped <- sub_fun_1(df1, columns) ### Evaluates 'columns' and groups df1 by column names

df2_grouped <- sub_fun_2(df2, columns) ### Evaluates 'columns' and groups df2 by column names
}
sub_fun_1 <- function(df1, columns) {
df1_grouped <- df1 %>%
group_by(!!! columns)
}

sub_fun_2 <- function(df2, columns) {
df2_grouped <- df2 %>%
group_by(!!! columns)
}

However, I cannot use the same column names for both data-sets, as that would result in an error, i.e. both data-sets will need to be grouped by column names unique to them.

Is there a way I can specify which ellipses arguments correspond to which function/data-frame? Or possibly use two unique sets of ellipses arguments?

I found some similar questions/answers pages, but am still confused on the topic and how to best implement a solution toward my particular problem.

clc
  • 107
  • 6
  • In your post, it is only mentioned about the grouping part. Does the `sub_fun` includes the `summarise/mutate` function with correct column names for each dataset? – akrun Mar 02 '20 at 20:01
  • It's easier to help you if you include a simple [reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) with sample input and desired output that can be used to test and verify possible solutions. – MrFlick Mar 02 '20 at 20:08
  • Related to: [Is there a way to use two '…' statements in a function in R?](https://stackoverflow.com/questions/4124900/is-there-a-way-to-use-two-statements-in-a-function-in-r) – MrFlick Mar 02 '20 at 20:08
  • @akrun Thanks for the input. `sub_fun` only groups. I cleaned up my code a little and added some more about `sub_fun_1` and `sub_fun_2`. – clc Mar 02 '20 at 20:23

1 Answers1

2

One option is to use intersect after converting to characters

library(dplyr)
library(purrr)
main_fun <- function(data1, data2, ...) {

      columns <- map_chr(enquos(...), rlang::quo_name)
      sub_fun1 <- data1 %>% 
                    group_by_at(vars(intersect(names(.), columns))) 

      sub_fun2 <- data2 %>% 
                    group_by_at(vars(intersect(names(.), columns))) 

      list(sub_fun1, sub_fun2)




  }

main_fun(iris, mtcars, gear, vs, Species)
#[[1]]
# A tibble: 150 x 5
# Groups:   Species [3]
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
# 1          5.1         3.5          1.4         0.2 setosa 
# 2          4.9         3            1.4         0.2 setosa 
# 3          4.7         3.2          1.3         0.2 setosa 
# 4          4.6         3.1          1.5         0.2 setosa 
# 5          5           3.6          1.4         0.2 setosa 
# 6          5.4         3.9          1.7         0.4 setosa 
# 7          4.6         3.4          1.4         0.3 setosa 
# 8          5           3.4          1.5         0.2 setosa 
# 9          4.4         2.9          1.4         0.2 setosa 
#10          4.9         3.1          1.5         0.1 setosa 
# … with 140 more rows

#[[2]]
# A tibble: 32 x 11
# Groups:   vs, gear [6]
#     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
# 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
# 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
# 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
# 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
# 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
# 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
# 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
# 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
#10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# … with 22 more rows
akrun
  • 874,273
  • 37
  • 540
  • 662