एक तिगुने पर विचार करें जहां प्रत्येक स्तंभ एक वर्ण वेक्टर है जो कई मान ले सकता है - चलो "एफ" के माध्यम से "ए" कहते हैं।
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
मैं एक फ़ंक्शन बनाना चाहता हूं जो एक कॉलम नाम को एक तर्क के रूप में लेता है, और उस कॉलम को रीकोड करता है ताकि कोई भी उत्तर "ए" एनए बन जाए और डीएफ अन्यथा अन्यथा वापस आ जाए। इसे इस तरह से डिजाइन करने का कारण एक व्यापक पाइपलाइन में फिट होना है जो किसी दिए गए कॉलम का उपयोग करके कई ऑपरेशन करता है।
इसे करने के कई तरीके हैं। लेकिन मुझे यह समझने में दिलचस्पी है कि सबसे अच्छा मुहावरेदार 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") देता है। मैंने आधार हाथ [[
ऑपरेटर के आधार का उपयोग करके और .
dplyr से निर्माण पर भरोसा करते हुए, दाएं हाथ की तरफ डेटा को संदर्भित करने के लिए एक हैकी मार्ग की तरह महसूस करता हुआ समाप्त कर दिया , और यह काम करता है, इसलिए एक अर्थ में मैंने अपनी अंतर्निहित समस्या को हल किया है:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
मुझे ऐसे लोगों से प्रतिक्रिया प्राप्त करने में दिलचस्पी है जो tidyeval में बहुत अच्छे हैं जैसे कि क्या ऐसा करने के लिए अधिक मुहावरेदार तरीका है, इस उम्मीद में कि काम किया उदाहरण देखकर tidyeval फ़ंक्शन की मेरी समझ अधिक आम तौर पर सेट हो जाएगी। कोई विचार?
q1
(प्रतीक) और "q1"
(स्ट्रिंग) के साथ काम करता है :df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)