Розглянемо таблицю, де кожен стовпець є символьним вектором, який може приймати багато значень - скажімо, "A" через "F".
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
Я хочу створити функцію, яка приймає назву стовпця як аргумент, і перекодує цей стовпець, щоб будь-яка відповідь "А" перетворилася на NA, а df повернувся в іншому випадку як є. Причиною проектування цього способу є вписання в більш широкий трубопровід, який виконує низку операцій за допомогою заданого стовпця.
Є багато способів зробити це. Але мені цікаво зрозуміти, яким буде найкращий ідіоматичний підхід tidy_eval / tidyverse. По-перше, ім'я питання має бути зліва від мутаційного дієслова, тому ми використовуємо оператори !!
та :=
належним чином. Але потім, що поставити на праву сторону?
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")
Моя початкова думка полягала в тому, що це спрацює:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
Але, звичайно, вибух-удар на внутрішній функції просто повертає буквальний рядок символів (наприклад, "q1"). Я в кінцевому підсумку взяв те, що відчуває себе хакізним маршрутом для посилання на дані з правого боку, використовуючи базовий [[
оператор R і спираючись на .
конструкцію від dplyr, і це працює, тому в певному сенсі я вирішив свою основну проблему:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
Мені цікаво отримати зворотній зв'язок від людей, які дуже добре займаються питанням, чи є більш ідіоматичний спосіб зробити це, сподіваючись, що бачення відпрацьованого прикладу покращить моє розуміння функції, встановленої на тривалість, загалом. Будь-які думки?
q1
символом, так і з "q1"
рядком:df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)