Как определить функцию в dplyr? - PullRequest
2 голосов
/ 05 июля 2019

Я создал простую сводную таблицу в пакете dplyr в R. Вот мой рабочий пример:

library(dplyr)
mean_mpg <- mean(mtcars$mpg)

# creating a new variable that shows that Miles/(US) gallon is greater than the mean or not

mtcars <-
mtcars %>%
  mutate(mpg_cat = ifelse(mpg > mean_mpg, 1,0))

mtcars %>%
  group_by(as.factor(cyl)) %>%
  summarise(sum=sum(mpg_cat),total=n()) %>%
  mutate(percentage=sum*100/total)

Теперь я хочу написать функцию для повторного использования этого кода:

get_pivot <- function(data, predictor,target) {
  result <-
    data %>%
    group_by(as.factor(predictor)) %>%
    summarise(sum=sum(target),total=n()) %>%
    mutate(percentage=sum*100/total);

  print(result)
}

но я получаю следующую ошибку:

Ошибка в is.factor (x): объект 'cyl' не найден

Я также пытался

get_pivot(mtcars, "cyl", "mpg_cat" )

но это не сработало.

Что мне делать?

1 Ответ

7 голосов
/ 05 июля 2019

Если у вас самое последнее обновление библиотеки rlang v0.4.0 (июнь 2019 г.), вы можете использовать двойные фигурные скобки {{ }} (он же «фигурные фигурные»), чтобы упростить программирование с помощью dplyr.

# Note: needs installation of rlang 0.4.0 or later
get_pivot <- function(data, predictor,target) {
  result <-
    data %>%
    group_by(as.factor( {{ predictor }} )) %>%
    summarise(sum=sum( {{ target }} ),total=n()) %>%
    mutate(percentage=sum*100/total);

  print(result)
}

# Edit -- thank you Rui Barradas
> get_pivot(mtcars, cyl, mpg_cat)
# A tibble: 3 x 4
  `as.factor(cyl)`   sum total percentage
  <fct>            <dbl> <int>      <dbl>
1 4                   11    11      100  
2 6                    3     7       42.9
3 8                    0    14        0  

Причина, по которой это требуется, заключается в том, что dplyr и другие tidyverse пакеты используют «нестандартную оценку», как вы сталкиваетесь с некоторыми базовыми функциями R, такими как lm(mpg~factor(am),data=mtcars).Эта практика часто делает «интерактивный» код короче, проще и легче для чтения, но за счет усложнения программирования.В этом случае оператор {{ }} служит для переноса указанного столбца в контекст функции.

https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...