Как использовать «суммировать» из dplyr с именами колонок Dynami c? - PullRequest
2 голосов
/ 30 января 2020

Я суммирую групповые значения из таблицы, используя функцию 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=(...) и др. c., Но я не понял, правильно способ сделать это еще.

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

Спасибо!

Ответы [ 2 ]

5 голосов
/ 30 января 2020

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)
2 голосов
/ 30 января 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...