Группировка по нескольким программно указанным переменным в dplyr 0.6

Это с новым dplyr, который будет выпущен в ближайшее время.

сценка программирования dplyr дает пример вызова group_by с переменными группировки, указанными во внешнем функция:

my_summarise <- function(df, group_var) {
  df %>%
    group_by(!!group_var) %>%
    summarise(a = mean(a))
}

Это работает при наличии одной группирующей переменной. Однако он терпит неудачу с несколькими переменными.

Упрощенный пример:

f <- function(x)
{
    group_by(mtcars, !!x)
}

## works
g1 <- "cyl"
f(g1)

## doesn't work
#Error in mutate_impl(.data, dots) : 
#  Column `c("cyl", "gear")` must be length 32 (the number of rows) or one, not 2
g2 <- c("cyl", "gear")
f(g2)

Как я могу это исправить в рамках rlang?

В идеале я хочу, чтобы подпись f оставалась прежней, т.е. я указываю группирующие переменные как один вектор, а не через аргумент ....


person Hong Ooi    schedule 24.05.2017    source источник
comment
На самом деле, f(g1) тоже не работает. Попробуйте f(g1) %>% summarize(n=n()).   -  person JasonWang    schedule 25.05.2017


Ответы (1)


Был довольно похожий вопрос: Программирование с помощью dplyr с использованием строки в качестве ввода . Я просто немного изменил ответ, чтобы использовать syms и !!!.

library(rlang)
f <- function(x){
  group_by(mtcars, !!!syms(x))
}

f(c("cyl")) %>% summarise(n())
# A tibble: 3 x 2
    cyl `n()`
  <dbl> <int>
1     4    11
2     6     7
3     8    14

f(c("cyl", "gear")) %>% summarise(n())
# A tibble: 8 x 3
# Groups:   cyl [?]
    cyl  gear `n()`
  <dbl> <dbl> <int>
1     4     3     1
2     4     4     8
3     4     5     2
4     6     3     2
5     6     4     4
6     6     5     1
7     8     3    12
8     8     5     2
person JasonWang    schedule 24.05.2017