Как использовать вектор имен столбцов в качестве входных данных для dplyr :: group_by ()? - PullRequest
1 голос
/ 12 июля 2019

Я хочу создать функцию на основе dplyr, которая выполняет определенные операции над подмножествами данных. Подмножества определяются значениями одного или нескольких ключевых столбцов в наборе данных. Когда для идентификации подмножеств используется только один столбец, мой код работает нормально:

set.seed(1)
df <- tibble(
  g1 = c(1, 1, 2, 2, 2),
  g2 = c(1, 2, 1, 2, 1),
  a = sample(5)
)
group_key <- "g1"
aggregate <- function(df, by) {
  df %>% group_by(!!sym(by)) %>% summarize(a = mean(a))
}
aggregate(df, by = group_key)

Это работает как ожидалось и возвращает что-то вроде этого:

# A tibble: 2 x 2
     g1     a
  <dbl> <dbl>
1     1   1.5
2     2   4  

К сожалению, все меняется, если я меняю group_key:

group_key <- c("g1", "g2")
aggregate(df, by = group_key)

Я получаю сообщение об ошибке: Only strings can be converted to symbols, которое, я думаю, происходит от rlang::sym(). Замена на syms() не работает, так как я получаю список имен, на которых group_by() задыхается.

Любые предложения будут оценены!

Ответы [ 2 ]

5 голосов
/ 12 июля 2019

Вам необходимо использовать оператор unquote-splice !!!:

aggregate <- function(df, by) {
  df %>% group_by(!!!syms(by)) %>% summarize(a = mean(a))
}

group_key <- c("g1", "g2")

aggregate(df, by = group_key)
## A tibble: 4 x 3
## Groups:   g1 [2]
#     g1    g2     a
#  <dbl> <dbl> <dbl>
#1     1     1   1  
#2     1     2   4  
#3     2     1   2.5
#4     2     2   5 
2 голосов
/ 12 июля 2019

В качестве альтернативы вы можете использовать dplyr::group_by_at:

agg <- function(df, by) {
  require(dplyr)
  df %>% group_by_at(vars(one_of(by))) %>% summarize(a = mean(a))}

group_key <- "g1"
group_keys <- c("g1","g2")

agg(df, by = group_key)
#> # A tibble: 2 x 2
#>      g1     a
#>   <dbl> <dbl>
#> 1     1  2.5 
#> 2     2  3.33

agg(df, by = group_keys)
#> # A tibble: 4 x 3
#> # Groups:   g1 [2]
#>      g1    g2     a
#>   <dbl> <dbl> <dbl>
#> 1     1     1   1  
#> 2     1     2   4  
#> 3     2     1   2.5
#> 4     2     2   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...