Как использовать суммирование из dplyr с динамическими именами столбцов?

Я суммирую групповые средства из таблицы, используя функцию summarize из пакета dplyr в R. Я хотел бы сделать это динамически, используя строку имени столбца, хранящуюся в другой переменной.

Это "нормальный" способ, и он, конечно же, работает:

myTibble <- group_by( iris, Species)
summarise( myTibble, avg = mean( Sepal.Length))

# A tibble: 3 x 2
  Species     avg
  <fct>      <dbl>
1 setosa      5.01
2 versicolor  5.94
3 virginica   6.59

Однако вместо этого я хотел бы сделать что-то вроде этого:

myTibble <- group_by( iris, Species)
colOfInterest <- "Sepal.Length"
summarise( myTibble, avg = mean( colOfInterest))

Я прочитал страницу Программирование с помощью dplyr и попробовал кучу комбинации quo, enquo, !!, .dots=(...) и т. д., но я еще не придумал, как это сделать.

Мне также известен этот ответ, но 1 ) когда я использую функцию стандартной оценки standardise_, R сообщает мне, что она обесценилась, и 2) этот ответ совсем не выглядит элегантным. Итак, есть ли хороший и простой способ сделать это?

Спасибо!


person Vance    schedule 30.01.2020    source источник


Ответы (2)


1) Используйте !!sym(...) так:

colOfInterest <- "Sepal.Length"
iris %>% 
  group_by(Species) %>%
  summarize(avg = mean(!!sym(colOfInterest))) %>%
  ungroup

давая:

# A tibble: 3 x 2
  Species      avg
  <fct>      <dbl>
1 setosa      5.01
2 versicolor  5.94
3 virginica   6.59

2) Второй подход:

colOfInterest <- "Sepal.Length"
iris %>% 
  group_by(Species) %>%
  summarize(avg = mean(.data[[colOfInterest]])) %>%
  ungroup

Конечно, в базе R это просто:

aggregate(list(avg = iris[[colOfInterest]]), iris["Species"], mean)
person G. Grothendieck    schedule 30.01.2020

Другое решение:

iris %>% 
  group_by(Species) %>% 
  summarise_at(vars("Sepal.Length"), mean) %>%
  ungroup()

# A tibble: 3 x 2
  Species    Sepal.Length
  <fct>             <dbl>
1 setosa             5.01
2 versicolor         5.94
3 virginica          6.59
person Florian    schedule 30.01.2020