Prendi in considerazione una tabella in cui ogni colonna è un vettore di caratteri che può assumere molti valori - diciamo da "A" a "F".
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
Vorrei creare una funzione che prende il nome di una colonna come argomento e ricodifica quella colonna in modo tale che qualsiasi risposta "A" diventi una NA e il df venga altrimenti restituito così com'è. Il motivo per progettarlo in questo modo è adattarsi a una pipeline più ampia che esegue una serie di operazioni utilizzando una determinata colonna.
Ci sono molti modi per farlo. Ma sono interessato a capire quale sarebbe il miglior approccio idiomatico tidy_eval / tidyverse. Innanzitutto, il nome della domanda deve essere sul lato sinistro di un verbo mutato, quindi utilizziamo gli operatori !!
e in modo :=
appropriato. Ma allora, cosa mettere sul lato destro?
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")
Il mio pensiero iniziale era che avrebbe funzionato:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
Ma ovviamente il bang-bang all'interno della funzione restituisce semplicemente la stringa di caratteri letterali (ad esempio "q1"). Ho finito per prendere quello che sembra un percorso caotico per fare riferimento ai dati sul lato destro, usando l' [[
operatore R di base e .
basandomi sul costrutto da dplyr, e funziona, quindi in un certo senso ho risolto il mio problema di fondo:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
Sono interessato a ricevere feedback da persone che sono molto brave in ordine sul fatto che esista un modo più idiomatico per farlo, nella speranza che vedere un esempio funzionante migliorerebbe la mia comprensione della funzione di ordine generale più in generale. qualche idea?
q1
(simbolo) e "q1"
(stringa):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)