dplyr group by по нескольким столбцам путем передачи имен переменных в виде строк

Я работаю с R блестящим для некоторого разведательного анализа данных. У меня есть два элемента checkbox, в одном флажке я заполняю все категориальные переменные, а в других - числовые переменные. Затем я применяю группу по этим двум выборам следующим образом.

var1 <- input$variable1      # Checkbox with categorical variables
var2 <- input$variable2      # Checkbox with numerical variables

v$data <- dataset %>%
  group_by_(var1) %>%
  summarize_(Sum = interp(~sum(x), x = as.name(var2))) %>%
  arrange(desc(Sum))

Что работает отлично, когда есть группа только на одном столбце, но я хочу группировать несколько столбцов. Когда пользователь выбирает более одной категориальной переменной, он возвращает мне массив с именами столбцов. Как передать это в dplyr groupby.

Ответ 1

Если у вас есть вектор имен переменных, вы должны передать их в параметр .dots= group_by_. Например:

mtcars %>% 
   group_by_(.dots=c("mpg","hp","wt")) %>% 
   summarize(x=mean(gear))

Ответ 2

Вы можете использовать пакет rlang, созданный той же командой, которая создала dplyr.

В частности, вы можете использовать функцию syms и !!! функционировать так:

library(dplyr)
library(rlang)

group_cols <- c("vs", "am")

mtcars %>% 
  group_by(!!!syms(group_cols)) %>% 
  summarize(mean_wt = mean(wt))

Этот тесно связанный вопрос и ответ объясняет, как !! Оператор и функция sym используются для имени одного столбца (то есть вектор длины один символ).

Ответ 3

Последние версии пакета dplyr включают варианты group_by, такие как group_by_if и group_by_at. Вы можете использовать их для выбора столбцов с синтаксисом, аналогичным функции select.

Подобно тому, как вы можете выбрать список столбцов с помощью select(my_data, one_of(group_cols)), вы можете использовать group_by_at для выполнения следующих действий:

library(dplyr)

group_cols <- c("vs", "am")

mtcars %>% 
  group_by_at(.vars = vars(one_of(group_cols))) %>% 
  summarize(mean_wt = mean(wt))