Hãy xem xét một tibble trong đó mỗi cột là một vectơ ký tự có thể nhận nhiều giá trị - giả sử "A" đến "F".
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
Tôi muốn tạo một hàm lấy tên cột làm đối số và mã hóa lại cột đó để bất kỳ câu trả lời "A" nào trở thành NA và df được trả lại như cũ. Lý do để thiết kế nó theo cách này là để phù hợp với một đường ống rộng hơn thực hiện một loạt các hoạt động bằng cách sử dụng một cột nhất định.
Có rất nhiều cách để làm điều này. Nhưng tôi quan tâm đến việc hiểu cách tiếp cận thành ngữ tidy_eval / tidyverse tốt nhất sẽ là gì. Đầu tiên, tên câu hỏi cần nằm ở phía bên trái của một động từ đột biến, vì vậy chúng tôi sử dụng các toán tử !!
và :=
toán tử một cách thích hợp. Nhưng sau đó, những gì để đặt ở phía bên tay phải?
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")
Suy nghĩ ban đầu của tôi là điều này sẽ hoạt động:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
Nhưng tất nhiên, bang-bang bên trong hàm chỉ trả về chuỗi ký tự bằng chữ (ví dụ "q1"). Cuối cùng tôi đã lấy cảm giác giống như một tuyến đường hack để tham chiếu dữ liệu ở phía bên tay phải, sử dụng [[
toán tử R cơ sở và dựa vào .
cấu trúc từ dplyr, và nó hoạt động, vì vậy theo nghĩa tôi đã giải quyết được vấn đề tiềm ẩn của mình:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
Tôi quan tâm đến việc nhận phản hồi từ những người rất giỏi về tidyeval về việc liệu có cách nào thành ngữ hơn để làm điều này hay không, với hy vọng rằng việc xem một ví dụ hoạt động sẽ tăng cường sự hiểu biết của tôi về chức năng ngăn nắp nói chung hơn. Có suy nghĩ gì không?
q1
(biểu tượng) và "q1"
(chuỗi):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)