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


13

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

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

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

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

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") প্রদান করে returns ডান হাতের উপাত্তের উপর ভিত্তি করে ডেটা রেফারেন্স করতে, বেস আর [[অপারেটরটি ব্যবহার করে এবং .ডিপ্লায়ার থেকে কনস্ট্রাক্টের উপর নির্ভর করে , এবং এটি কাজ করে, তাই এক অর্থে আমি আমার অন্তর্নিহিত সমস্যাটির সমাধান করেছি: আমি হ্যাকি রুটের মতো যা মনে করি তা শেষ করেছিলাম:

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

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


ধন্যবাদ, এটি একটি চতুর পন্থা - আমি আমার কোডের অন্যান্য অংশগুলিতে কার্যকরী পদ্ধতির ব্যবহার করি এবং এটি এখানেও করার বিষয়ে ভাবতে পারি। আমি জানি কিছু লোক এসও-তে কোড স্টাইল টক নিয়ে ভ্রান্ত হয়েছিলেন, তবে এত তাড়াতাড়ি কয়েকটি ভিন্ন শৈলীর উত্তর দেখে আমার পক্ষে খুব ফলপ্রসূ হয়েছিল।
অ্যারোন

1
এই প্রশ্নে বেশ কয়েকটি ধারণার সংমিশ্রণে, আমি বিশ্বাস করি এটিই সর্বাধিক সংগত সংস্করণ যা উভয় q1(চিহ্ন) এবং "q1"(স্ট্রিং) উভয়ের সাথে কাজ করে :df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)
আর্টেম সোকলভ

উত্তর:


6

এখানে, ডানদিকে :=, আমরা symপ্রতীক রূপান্তর করতে নির্দিষ্ট করতে পারি এবং তারপরে মূল্যায়ন ( !!)

fix_question <- function(df, question) {
    df %>%
       mutate(!!question := recode(!! rlang::sym(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 <- function(df, question) {
    question <- ensym(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    

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

2
আমি কয়েকটি র‌্যাং রূপান্তর ফাংশন নিয়ে প্রায় চেষ্টা করেছি কিন্তু স্পষ্টতই সঠিকটি বেছে নিইনি, তবে আপনার পদ্ধতির কাজ করে - আমি মনে করি সত্যই আমার মাথার ধরণের রূপান্তরগুলি কেবল ওয়ার্কফ্লো করার দরকার। আমার !! প্রশ্নটি কাজ করে না কারণ এটি একটি অক্ষরের স্ট্রিংকে আক্ষরিক মূল্যায়ন করে। আপনার কাজ করে কারণ এটি প্রথমে অক্ষরের স্ট্রিংটিকে একটি প্রতীক রূপান্তর করে এবং তারপরে প্রতীকটি মূল্যায়ন করে ভেক্টরকে ফিরিয়ে দেয়। আমি কেবল আমার মাথাটি গুটিয়ে রাখতে পারিনি যে এটি ছিল ক্রমের ক্রম। আবার ধন্যবাদ.
অ্যারোন

8

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

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

এটি একটি পদক্ষেপে কোট-তারপরে আনকোটের দুটি পদক্ষেপের প্রক্রিয়াটি একত্রিত করে, তাই {{question}}এর সমান!!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    

2
আমি এখনও "কোঁকড়ানো কোঁকড়ানো" অভ্যাসে প্রবেশ করতে পারেনি। আপনি কি জানেন যে এটি কেন কাজ করে, যখন অপের আপাতদৃষ্টিতে অভিন্ন "ব্যাং ব্যাং" সংস্করণটি হয়নি?
ক্যামিল

কোঁকড়ানো-কোঁকড়া উল্লেখ করার জন্য ধন্যবাদ, যা আমি শুনেছিলাম আসন্ন ছিল। উত্তরটি আমি যে কোনও সংস্করণ ইনস্টল করেছি সেটির জন্য কাজ করে না; আমি এলএইচএসের সাথে একটি ত্রুটি পেয়েছি। যদি আমি এলএইচএসকে আমার এলএইচএস এবং কোট ক্যো 1 দিয়ে প্রতিস্থাপন করি তবে আমার উপরে একই সমস্যাটি আসবে; আমি যদি Q1 এর উদ্ধৃতি না দিয়ে থাকি তবে আমি একটি ত্রুটি পাই। এটি সম্ভবত একটি সংস্করণ জিনিস।
অ্যারোন

1
হ্যাঁ র‌্যাং ০.৪.০ সবেমাত্র জুনের শেষ দিকে মুক্তি পেয়েছিল তাই আপনি যদি এটি আপডেট না করে থাকেন তারপরে এটি আপনার পক্ষে কাজ করবে না
আইসক্রিমটউকেন

2
আমার মনে হয় ব্যাং-ব্যাং কাজ করেনি কারণ dplyr পাইপ ব্যবহার করার আগে questionপ্রথমে একটি (ক্যাসোজার question = enquo(question)) রূপান্তর করা দরকার। {{question}}সমতূল্য !!enquo(question)
eipi10

2
সমতুল্য হওয়ার জন্য আপনার প্রশ্নের প্রথম উদাহরণের জন্য এনোকো প্রয়োজন।
আইসক্রিমটাউকেন

7

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

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তা এটিকে ...যুক্তি হিসাবে ব্যবহার করা হয় 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")))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.