Considere uma tag em que cada coluna é um vetor de caracteres que pode assumir muitos valores - digamos "A" a "F".
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
Desejo criar uma função que tome o nome de uma coluna como argumento e recodifique essa coluna para que qualquer resposta "A" se torne um NA e o df seja retornado como está. O motivo para projetá-lo dessa maneira é se encaixar em um pipeline mais amplo que executa uma série de operações usando uma determinada coluna.
Existem diversas formas de fazer isto. Mas estou interessado em entender qual seria a melhor abordagem idiomática tidy_eval / tidyverse. Primeiro, o nome da pergunta precisa estar no lado esquerdo de um verbo mutado; portanto, usamos os operadores !!
e :=
adequadamente. Mas então, o que colocar no lado direito?
fix_question <- function(df, question) {
df %>% mutate(!!question := recode(... something goes here...))
}
fix_question(sample_df, "q1") # should produce a tibble whose first column is (NA, "B", "C")
Meu pensamento inicial era que isso funcionaria:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
Mas é claro que o bang-bang dentro da função apenas retorna a cadeia de caracteres literal (por exemplo, "q1"). Acabei pegando o que parece uma rota hacky para referenciar os dados no lado direito, usando o [[
operador R base e confiando na .
construção do dplyr, e funciona, então, em certo sentido, resolvi meu problema subjacente:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
Estou interessado em receber feedback de pessoas que são muito boas em termos de arrumação quanto à existência de uma maneira mais idiomática de fazer isso, na esperança de que ver um exemplo funcionado melhore minha compreensão da função arrumada de maneira mais geral. Alguma ideia?
q1
(símbolo) e "q1"
(string):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)