Как использовать dplyr :: group_by с несколькими группами при программировании - PullRequest
1 голос
/ 04 марта 2020

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

test = data.frame(factor1 = sample(1:5, 10, replace=T),
                  factor2 = sample(letters[1:5], 10, replace=T),
                  variable = sample(100:200, 10))

group_vars = c('factor1','factor2') %>% paste(., collapse = ',')

> test %>% dplyr::group_by_(group_vars)
Error in parse(text = x) : <text>:1:8: unexpected ','
1: factor1,
           ^

Теперь я до сих пор это работало до сегодняшнего дня. Конечно, dplyr все равно пытается покончить с функциями 'x_', но я попытался включить все, что я могу придумать, в group_by () - используя комбинации !!, !!!, sym (), quo () , enquo (), et c и не могу понять. Я пытался не вставлять имена столбцов вместе, и НА ЛУЧШЕМ он просто берет первый и игнорирует все остальное. Чаще всего я получаю следующее сообщение об ошибке:

Ошибка: столбец <chr> должен иметь длину 10 (количество строк) или единицу, а не 2

I ' Мы также прочитали руководство по программированию Хадли на dplyr (https://dplyr.tidyverse.org/articles/programming.html), КОТОРОЕ ПОЯВЛЯЕТСЯ для решения этой проблемы, за исключением того, что я генерирую имена столбцов внутри себя и не принимаю их в качестве аргументов функции. Кто-нибудь сталкивался с этим или понимал цитирование достаточно хорошо, чтобы знать решение этого вопроса?

Кроме того, чтобы было ясно, это работает, когда используется только одна группирующая переменная. Проблема с несколькими группами.

Спасибо!

1 Ответ

2 голосов
/ 04 марта 2020

Вместо paste использования и использования group_by_ (устарело - но это не сработает, потому что оно ожидает NSE), мы можем напрямую использовать вектор в group_by_at

library(dplyr)
group_vars <- c('factor1','factor2')
test %>%
     group_by_at(group_vars)
# A tibble: 10 x 3
# Groups:   factor1, factor2 [10]
#   factor1 factor2 variable
#     <int> <fct>      <int>
# 1       1 d            145
# 2       5 e            119
# 3       4 a            181
# 4       3 e            155
# 5       3 d            164
# 6       3 b            135
# 7       4 e            137
# 8       4 d            197
# 9       2 d            142
#10       2 c            110

Или другой вариант - преобразовать в символы (syms из rlang) и оценить (!!!) в пределах group_by

test %>%
      group_by(!!! rlang::syms(group_vars))

Если мы go по маршруту paste, тогда один из вариантов - parse_expr (из rlang)

group_vars = c('factor1','factor2') %>% paste(., collapse = ';')
test %>%
      group_by(!!! rlang::parse_exprs(group_vars))
# A tibble: 10 x 3
# Groups:   factor1, factor2 [10]
#   factor1 factor2 variable
#     <int> <fct>      <int>
# 1       1 d            145
# 2       5 e            119
# 3       4 a            181
# 4       3 e            155
# 5       3 d            164
# 6       3 b            135
# 7       4 e            137
# 8       4 d            197
# 9       2 d            142
#10       2 c            110
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...