Ответ 1
Если у вас есть вектор имен переменных, вы должны передать их в параметр .dots=
group_by_
. Например:
mtcars %>%
group_by_(.dots=c("mpg","hp","wt")) %>%
summarize(x=mean(gear))
Я работаю с 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.
Если у вас есть вектор имен переменных, вы должны передать их в параметр .dots=
group_by_
. Например:
mtcars %>%
group_by_(.dots=c("mpg","hp","wt")) %>%
summarize(x=mean(gear))
Вы можете использовать пакет rlang
, созданный той же командой, которая создала dplyr
.
В частности, вы можете использовать функцию syms
и !!!
функционировать так:
library(dplyr)
library(rlang)
group_cols <- c("vs", "am")
mtcars %>%
group_by(!!!syms(group_cols)) %>%
summarize(mean_wt = mean(wt))
Этот тесно связанный вопрос и ответ объясняет, как !!
Оператор и функция sym
используются для имени одного столбца (то есть вектор длины один символ).
Последние версии пакета 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))