ลองพิจารณาดูซิว่าแต่ละคอลัมน์เป็นเวกเตอร์ของตัวละครที่สามารถมีค่าได้มากมายสมมติว่า "A" ถึง "F"
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
ฉันต้องการสร้างฟังก์ชั่นที่ใช้ชื่อคอลัมน์เป็นอาร์กิวเมนต์และ recodes คอลัมน์นั้นเพื่อให้คำตอบ "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_))
ฉันสนใจที่จะรับข้อเสนอแนะจากผู้ที่มีความเชี่ยวชาญในเรื่อง tidyeval มากว่าจะมีวิธีการทำแบบนี้หรือเปล่าโดยหวังว่าการดูตัวอย่างการทำงานจะช่วยเพิ่มความเข้าใจของฉันเกี่ยวกับฟังก์ชัน tidyeval ที่ตั้งโดยทั่วไป ความคิดใด ๆ
q1
(สัญลักษณ์) และ"q1"
(สตริง):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)