Как использовать dplyr :: group_by в функции

Я хотел бы создать функцию, которая будет создавать таблицу со счетчиками на основе одной или нескольких группирующих переменных. Я нашел это сообщение Использование dplyr group_by в функции, которая работает, если я передать функции одно имя переменной

library(dplyr)
l <- c("a", "b", "c", "e", "f", "g")
animal <- c("dog", "cat", "dog", "dog", "cat", "fish")
sex <- c("m", "f", "f", "m", "f", "unknown")
n <- rep(1, length(animal))
theTibble <- tibble(l, animal, sex, n)


countString <- function(things) {
  theTibble %>% group_by(!! enquo(things)) %>% count()
}

countString(animal)
countString(sex)

Это прекрасно работает, но я не знаю, как передать функции две переменные. Такого рода работы:

countString(paste(animal, sex))

Это дает мне правильные подсчеты, но возвращенная таблица сворачивает переменные животного и пола в одну переменную.

# A tibble: 4 x 2
# Groups:   paste(animal, sex) [4]
  `paste(animal, sex)`    nn
  <chr>                <int>
1 cat f                    2
2 dog f                    1
3 dog m                    2
4 fish unknown             1

Каков синтаксис передачи в функцию двух слов, разделенных запятыми? Я хочу получить такой результат:

# A tibble: 4 x 3
# Groups:   animal, sex [4]
  animal sex        nn
  <chr>  <chr>   <int>
1 cat    f           2
2 dog    f           1
3 dog    m           2
4 fish   unknown     1

person itsMeInMiami    schedule 23.05.2018    source источник


Ответы (2)


Вы можете использовать group_by_at и индекс столбца, например:

countString <- function(things) {
  index <- which(colnames(theTibble) %in% things)
  theTibble %>% 
       group_by_at(index) %>% 
       count()
}

countString(c("animal", "sex"))

## A tibble: 4 x 3
## Groups:   animal, sex [4]
#  animal sex        nn
#  <chr>  <chr>   <int>
#1 cat    f           2
#2 dog    f           1
#3 dog    m           2
#4 fish   unknown     1
person DJack    schedule 23.05.2018
comment
Это прекрасно понять. Большое спасибо. - person itsMeInMiami; 23.05.2018

Мы заменили «вещи» на ... для нескольких аргументов, аналогично enquos на !!! для нескольких аргументов. Удалил group_by с count

countString <- function(...) {
  grps <- enquos(...)
  theTibble %>%
       count(!!! grps) 
}


countString(sex)
# A tibble: 3 x 2
#  sex        nn
#  <chr>   <int>
#1 f           3
#2 m           2
#3 unknown     1

countString(animal)
# A tibble: 3 x 2
#  animal    nn
#  <chr>  <int>
#1 cat        2
#2 dog        3
#3 fish       1

countString(animal, sex)
# A tibble: 4 x 3
#  animal sex        nn
#  <chr>  <chr>   <int>
#1 cat    f           2
#2 dog    f           1
#3 dog    m           2
#4 fish   unknown     1
person akrun    schedule 23.05.2018