Considere un tibble donde cada columna es un vector de caracteres que puede tomar muchos valores, digamos "A" a "F".
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
Deseo crear una función que tome el nombre de una columna como argumento, y recodifique esa columna para que cualquier respuesta "A" se convierta en un NA y el df se devuelva como está. La razón para diseñarlo de esta manera es encajar en una tubería más amplia que realiza una serie de operaciones utilizando una columna dada.
Hay muchas maneras de hacer esto. Pero estoy interesado en comprender cuál sería el mejor enfoque idiomático tidy_eval / tidyverse. Primero, el nombre de la pregunta debe estar en el lado izquierdo de un verbo mutado, por lo que usamos los operadores !!
y :=
adecuadamente. Pero entonces, ¿qué poner en el lado derecho?
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")
Mi pensamiento inicial fue que esto funcionaría:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
Pero, por supuesto, el bang-bang dentro de la función solo devuelve la cadena de caracteres literal (por ejemplo, "q1"). Terminé tomando lo que parece una ruta hacky para hacer referencia a los datos en el lado derecho, usando el [[
operador base R y confiando en la .
construcción de dplyr, y funciona, por lo que en cierto sentido he resuelto mi problema subyacente:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
Estoy interesado en recibir comentarios de personas que son muy buenas en tidyeval en cuanto a si hay una forma más idiomática de hacer esto, con la esperanza de que ver un ejemplo trabajado mejoraría mi comprensión del conjunto de funciones tidyeval en general. ¿Alguna idea?
q1
(símbolo) y "q1"
(cadena):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)