Использование dplyr group_by в функции

Я пытаюсь использовать dplyr group_by в локальной функции, например:

testFunction <- function(df, x) {
  df %>%
group_by(x) %>%
summarize(mean.Petal.Width = mean(Petal.Width))
}

testFunction(iris, Species)

и я получаю сообщение об ошибке «... неизвестная переменная для группировки по: x». Я пробовал group_by_, и он дает мне сводку всего набора данных. Кто-нибудь знает, как я могу это исправить?

Заранее спасибо!


person RoseS    schedule 20.06.2017    source источник


Ответы (2)


Вот один из способов работы с новым enquo из dplyr, где enquo принимает строку и преобразуется в quosure, который оценивается путем отмены кавычек (UQ или !!) в group_by, mutate, summarise и т. Д.

library(dplyr)
testFunction <- function(df, x) {
 x <- enquo(x)
  df %>%
    group_by(!! x) %>%
     summarize(mean.Petal.Width = mean(Petal.Width))
 }

testFunction(iris, Species)
# A tibble: 3 x 2
#     Species mean.Petal.Width
#      <fctr>            <dbl>
#1     setosa            0.246
#2 versicolor            1.326
#3  virginica            2.026
person akrun    schedule 20.06.2017
comment
Круто. Это работает, большое вам спасибо. У вас есть ссылочный URL-адрес, посвященный этому? - person RoseS; 20.06.2017
comment
@RoseS Вы можете проверить здесь - person akrun; 20.06.2017

У меня так работает:

testFunction <- function(df, x) {
                      df %>%
                         group_by(get(x)) %>%
                         summarize(mean.Petal.Width = mean(Petal.Width))
                 }

testFunction(iris,"Species")

Я изменил x на get(x) и Species на "Species" в testFunction(iris,...).

person CPak    schedule 20.06.2017
comment
Я пробовал 20 вещей, так что не спрашивайте, почему это работает ...;) - person CPak; 20.06.2017
comment
хммм, я думаю, что "get (x)" помогает ... кажется, теперь понятно, что группировать. Теперь я получаю сообщение об ошибке .... объект Виды не найдены, поэтому я не могу заставить его работать с кавычками или без них при вызове функции. У вас есть идеи, почему это может сработать для вас? Ха! Я только что видел ... не спрашивайте меня, как это работает - person RoseS; 20.06.2017
comment
У вас dplyr загружено? Обновлено dplyr? Вы также можете попробовать akrun ответ ... который должен быть эквивалентным. - person CPak; 20.06.2017
comment
У меня не было загруженного обновленного dplyr до тех пор, пока я не увидел ответ Акруна, так что, возможно, это так. Спасибо большое за вашу помощь! - person RoseS; 20.06.2017