Суммирование по динамическому имени столбца в dplyr - PullRequest
0 голосов
/ 26 мая 2018

Итак, я пытаюсь заняться программированием в dplyr, и у меня возникли проблемы с enquo и !!оценки.

По сути, я хотел бы преобразовать столбец в динамическое имя столбца, а затем иметь возможность дополнительно манипулировать этим столбцом (т. Е. Суммировать).Например:

my_function <- function(data, column) {

  quo_column <- enquo(column)

  new_col <- paste0(quo_column, "_adjusted")[2]

  data %>%
     mutate(!!new_col := (!!quo_column) + 1) 
  }

my_function(iris, Petal.Length)

Это прекрасно работает и возвращает столбец с именем "Petal.Length.adjusted", который просто Petal.Length, увеличенный на единицу.

Однако я не могу суммировать этот новый столбец.

my_function <- function(data, column) {

  quo_column <- enquo(column)

   new_col <- paste0(quo_column, "_adjusted")[2]

   mean_col <- paste0(quo_column, "_meanAdjusted")[2]

   data %>%
      mutate(!!new_col := (!!quo_column) + 1) %>%
      group_by(Species) %>%
      summarize(!!mean_col := mean(!!new_col))
}

my_function(iris, Petal.Length)

Это приводит к предупреждению о том, что аргумент "Petal.Length_adjusted" не является числовым или логическим, хотя выходные данные вызова mutate дают числовой столбец.

Как мне ссылатьсяэто динамически генерируемое имя столбца для передачи его в дальнейшие функции dplyr?

1 Ответ

0 голосов
/ 26 мая 2018

В отличие от quo_column, который является quosure, new_col и mean_col являются строками, поэтому мы преобразуем его в символ, используя sym (из rlang), а затем выполняем оценку

my_function <- function(data, column) {

   quo_column <- enquo(column)

   new_col <- paste0(quo_column, "_adjusted")[2]       

   mean_col <- paste0(quo_column, "_meanAdjusted")[2]

   data %>%
      mutate(!!new_col := (!!quo_column) + 1)  %>%
      group_by(Species) %>%
      summarise(!!mean_col := mean(!! rlang::sym(new_col)))
}

head(my_function(iris, Petal.Length))
# A tibble: 3 x 2
#  Species    Petal.Length_meanAdjusted
#  <fct>                          <dbl>
#1 setosa                          2.46
#2 versicolor                      5.26
#3 virginica                       6.55
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...