r - মুডিটের ডানদিকে রিকোডে টিডিয়েভাল ভিত্তিক অ-মানক মূল্যায়নের ব্যবহার




dplyr rlang (2)

আপনার যদি রিং> = 0.4.0 থাকে তবে আপনি এখন "কোঁকড়ানো কোঁকড়ানো" পদ্ধতিটি ব্যবহার করতে পারেন।

@ Eipi10- তে ব্যাখ্যা ধন্যবাদ:

এটি একটি পদক্ষেপের মধ্যে উদ্ধৃতি-পরে-উদ্ধৃতি দুটি পদক্ষেপের প্রক্রিয়া একত্রিত করে, তাই {{question}} equivalent সমান !!enquo(question)

fix_question <- function(df, question){
  df %>% mutate({{question}} := recode({{question}}, A = NA_character_))
}

fix_question(sample_df, q1)
# # A tibble: 3 x 2
#   q1    q2   
#   <chr> <chr>
# 1 NA    B    
# 2 B     B    
# 3 C     A    

নোট করুন যে ensym পদ্ধতির বিপরীতে, এটি চরিত্রের নামের সাথে কাজ করে না। আরও খারাপ, এটি কেবল একটি ত্রুটি দেওয়ার পরিবর্তে ভুল কাজ করে।

fix_question(sample_df, 'q1')

# # A tibble: 3 x 2
#   q1    q2   
#   <chr> <chr>
# 1 q1    B    
# 2 q1    B    
# 3 q1    A    

একটি টিবল বিবেচনা করুন যেখানে প্রতিটি কলাম এমন একটি চরিত্রের ভেক্টর যা অনেকগুলি মান নিতে পারে - আসুন "এফ" এর মাধ্যমে "এ" বলি।

library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))

আমি একটি ফাংশন তৈরি করতে চাই যা একটি কলামের নামটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং সেই কলামটি পুনর্নির্মাণ করে যাতে কোনও উত্তর "এ" একটি এনএ হয়ে যায় এবং ডিএফ অন্যথায় যেমন ফিরে আসে। এটি এইভাবে ডিজাইনের কারণ হ'ল একটি বিস্তৃত পাইপলাইনে ফিট করা যা প্রদত্ত কলামটি ব্যবহার করে ক্রিয়াকলাপ চালায়।

এটি করার অনেকগুলি উপায় রয়েছে। তবে আমি সেরা idiomatic পরিপাটি / জ্যোতির্ময় পদ্ধতির কী হবে তা বুঝতে আগ্রহী। প্রথমত, প্রশ্নের নামটি পরিবর্তিত ক্রিয়াটির বাম দিকে থাকা দরকার, তাই আমরা ব্যবহার করি !! এবং := অপারেটরগুলি যথাযথভাবে। তবে তারপরে, ডান হাতটি কী রাখবেন?

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_))

তবে অবশ্যই ফাংশনের অভ্যন্তরে ব্যাং-ব্যাং কেবল আক্ষরিক চরিত্রের স্ট্রিং প্রদান করে (যেমন "কিউ 1")। আমি বেস র [[ অপারেটরটি ব্যবহার করে এবং এর উপর নির্ভর করে) ডান হাতের উপাত্তগুলিকে রেফারেন্স দেওয়ার জন্য হ্যাকি রুটের মতো যা মনে করি তা শেষ করেছি . dplyr থেকে তৈরি করুন, এবং এটি কাজ করে, তাই এক অর্থে আমি আমার অন্তর্নিহিত সমস্যা সমাধান করেছি:

df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))

আমি এমন লোকদের কাছ থেকে প্রতিক্রিয়া জানাতে আগ্রহী যারা এই কাজটি করার মতো আরও একটি মুরগী ​​উপায় আছে কিনা এই বিষয়ে আশাবাদী যে একটি কাজের উদাহরণ দেখলে পরিদর্শনকারী অনুষ্ঠানের আরও সাধারণভাবে আমার ধারণা আরও বাড়বে hopes কোন চিন্তা? আপনার সময় জন্য আগাম ধন্যবাদ।


আপনি পুনর্নির্মাণ মানগুলির একটি ভেক্টরকে তর্ক হিসাবেও প্রবেশ করার অনুমতি দিয়ে ফাংশনটিকে কিছুটা নমনীয় করতে পারেন। উদাহরণ স্বরূপ:

library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))

fix_question <- function(df, question, recode.vec) {

  df %>% mutate({{question}} := recode({{question}}, !!!recode.vec))

}

fix_question(sample_df, q1, c(A=NA_character_, B="Was B"))
  q1    q2   
1 <NA>  B    
2 Was B B    
3 C     A

মনে রাখবেন যে recode.vec সাথে " recode.vec -স্প্লাইসড" !!! । আপনি দেখতে পাচ্ছেন যে এই উদাহরণটি দিয়ে কী হচ্ছে, প্রোগ্রামিং থেকে ডিপিপ্লায়ার ভিগনেটের সাথে অভিযোজিত (প্রাসঙ্গিক উদাহরণগুলি দেখতে "স্প্লাইস" অনুসন্ধান করুন)। কিভাবে নোট করুন !!! recode ক্রিয়াকলাপগুলিতে recode পুনরুদ্ধারের মানগুলির জোড়গুলিকে "স্প্লাইস" করে যাতে তারা পুনর্বিবেচনায় ... যুক্তি হিসাবে ব্যবহৃত হয়।

x = c("A", "B", "C")
args = c(A=NA_character_, B="Was B")

quo(recode(x, !!!args))

<quosure>
expr: ^recode(x, A = <chr: NA>, B = "Was B")
env:  global

আপনি যদি একাধিক কলামে সম্ভাব্যভাবে রিকডিং ফাংশনটি চালাতে চান তবে আপনি এটিকে এমন একটি ফাংশনে পরিণত করতে পারেন যা কেবল একটি কলামের নাম এবং একটি রিকডিং ভেক্টর নেয়। এই পদ্ধতির দেখে মনে হচ্ছে এটি আরও পাইপ-বান্ধব হবে।

fix_question <- function(question, recode.vec) {

  recode({{question}}, !!!recode.vec)

}

sample_df %>% 
  mutate_at(vars(matches("q")), list(~fix_question(., c(A=NA_character_, B="Was B"))))
  q1    q2   
1 <NA>  Was B
2 Was B Was B
3 C     <NA>

বা একটি একক কলাম পুনঃনির্মাণ করতে:

sample_df %>% 
  mutate(q1 = fix_question(q1, c(A=NA_character_, B="Was B")))






nse