Я хотел бы иметь возможность использовать dplyr group_by для группировки по нескольким столбцам, достаточно просто. Но сложность в том, что я хочу создать функцию, в которой один или несколько столбцов всегда находятся в группе, и пользователь может выбрать дополнительный столбец для группировки. То, что я пробовал до сих пор, включает использование нестроковой спецификации столбцов, которые всегда находятся в группе, и использование строки для столбца, который выбирает пользователь, но ничего из того, что я пробовал, не работает. Эта комбинация работает нормально в SELECT, но не в GROUP_BY. В идеале я бы предпочел не переключаться на все строки, потому что я хочу иметь возможность воспользоваться некоторыми функциями dplyr, которые позволяют мне выбирать диапазон столбцов. Ниже приведен пример.

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

test_tbl <- iris %>%
  mutate(extra_var1 = ifelse(Sepal.Length >= 5.0, "Yes", "No"),
         extra_var2 = "What")

Вот пример, в котором для всех переменных используется нестроковая спецификация, которая отлично работает:

test_tbl %>%
  select(Species, extra_var1, Sepal.Length, Petal.Width) %>%
  group_by(Species, extra_var1) %>%
  summarize(average.Sepal.Length = mean(Sepal.Length),
            average.Petal.Width = mean(Petal.Width))

Но я хотел бы иметь возможность в функции, чтобы пользователь мог указать, хотят ли они группировать по extra_var1 или extra_var2. Вот моя попытка, которая не работает. Опять же, я считаю, что часть select работает нормально, а часть group_by - нет.

group_and_summarize <- function(var) {
  test_tbl %>%
    select(Species, var, Sepal.Length, Petal.Width) %>%
    group_by(Species, var) %>%
    summarize(average.Sepal.Length = mean(Sepal.Length),
              average.Petal.Width = mean(Petal.Width))
}

group_and_summarize("extra_var1")
0
GeoffDS 11 Май 2021 в 17:31

1 ответ

Лучший ответ

Это был бы один из способов сделать это:

library(dplyr)

group_and_summarize <- function(var) {
  test_tbl %>%
    select(Species, {{var}}, Sepal.Length, Petal.Width) %>%
    group_by(Species, {{var}}) %>%
    summarize(average.Sepal.Length = mean(Sepal.Length),
              average.Petal.Width = mean(Petal.Width))
}

group_and_summarize(extra_var1)
#> `summarise()` regrouping output by 'Species' (override with `.groups` argument)
#> # A tibble: 6 x 4
#> # Groups:   Species [3]
#>   Species    extra_var1 average.Sepal.Length average.Petal.Width
#>   <fct>      <chr>                     <dbl>               <dbl>
#> 1 setosa     No                         4.67               0.195
#> 2 setosa     Yes                        5.23               0.28 
#> 3 versicolor No                         4.9                1    
#> 4 versicolor Yes                        5.96               1.33 
#> 5 virginica  No                         4.9                1.7  
#> 6 virginica  Yes                        6.62               2.03

Создано 11 мая 2021 г. пакетом REPEX (v0.3.0)

Если вы хотите, чтобы пользователь вводил строки, мы можем использовать !!! syms():

group_and_summarize <- function(vars) {
  test_tbl %>%
    select(Species, !!! syms(vars), Sepal.Length, Petal.Width) %>%
    group_by(Species, !!! syms(vars)) %>%
    summarize(average.Sepal.Length = mean(Sepal.Length),
              average.Petal.Width = mean(Petal.Width))
}

group_and_summarize(c("extra_var1", "extra_var2"))

#> `summarise()` regrouping output by 'Species', 'extra_var1' (override with `.groups` argument)
#> # A tibble: 6 x 5
#> # Groups:   Species, extra_var1 [6]
#>   Species    extra_var1 extra_var2 average.Sepal.Length average.Petal.Width
#>   <fct>      <chr>      <chr>                     <dbl>               <dbl>
#> 1 setosa     No         What                       4.67               0.195
#> 2 setosa     Yes        What                       5.23               0.28 
#> 3 versicolor No         What                       4.9                1    
#> 4 versicolor Yes        What                       5.96               1.33 
#> 5 virginica  No         What                       4.9                1.7  
#> 6 virginica  Yes        What                       6.62               2.03

Создано 11 мая 2021 г. пакетом REPEX (v0.3.0)

1
TimTeaFan 11 Май 2021 в 14:39