Написание пользовательской функции case_when для использования в dplyr mutate с использованием tidyeval - PullRequest
0 голосов
/ 16 февраля 2020

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

df1 <- data.frame(animal_1 = c("Horse", "Pig", "Chicken", "Cow", "Sheep"),
           animal_2 = c(NA, NA, "Horse", "Sheep", "Chicken"))


translate_title <- function(data, input_col, output_col) {
  mutate(data, 
    !!output_col := case_when(
    input_col == "Horse" ~ "Cheval",
    input_col == "Pig" ~ "Рorc",
    input_col == "Chicken" ~ "Poulet",
    TRUE ~ NA)
  )
}


df1 %>% 
  translate_title("animal_1", "animaux_1") %>% 
  translate_title("animal_2", "animaux_2")

Когда я пытаюсь запустить это, я получаю Error in mutate_impl(.data, dots) : Evaluation error: must be type string, not logical.

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

df1 %>% 
  mutate(animaux_1 = translate_title(animal_1),
         animaux_2 = translate_title(animal_2)
         )

Но не уверен, как.

1 Ответ

3 голосов
/ 16 февраля 2020

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

1) Передать ввод как без кавычек, используя {{}}

library(dplyr)

translate_title <- function(data, input_col, output_col) {

   mutate(data, 
        !!output_col := case_when(
        {{input_col}} == "Horse" ~ "Cheval",
        {{input_col}} == "Pig" ~ "Рorc",
        {{input_col}} == "Chicken" ~ "Poulet",
        TRUE ~ NA_character_)
  )
}

df1 %>% 
  translate_title(animal_1, "animaux_1") %>%
  translate_title(animal_2, "animaux_2")

#  animal_1 animal_2 animaux_1 animaux_2
#1    Horse     <NA>    Cheval      <NA>
#2      Pig     <NA>      Рorc      <NA>
#3  Chicken    Horse    Poulet    Cheval
#4      Cow    Sheep      <NA>      <NA>
#5    Sheep  Chicken      <NA>    Poulet

2) Передайте входные данные в кавычках, используя sym и !!

translate_title <- function(data, input_col, output_col) {
   mutate(data, 
         !!output_col := case_when(
          !!sym(input_col) == "Horse" ~ "Cheval",
          !!sym(input_col) == "Pig" ~ "Рorc",
          !!sym(input_col) == "Chicken" ~ "Poulet",
          TRUE ~ NA_character_)
  )
}

df1 %>% 
  translate_title("animal_1", "animaux_1") %>%
  translate_title("animal_2", "animaux_2")
...