কেন `[` `উপসেট` এর চেয়ে ভাল?


400

যখন আমাকে একটি ডেটা.ফ্রেম ফিল্টার করা দরকার, অর্থাত্, নির্দিষ্ট শর্তগুলি পূরণ করে এমন সারিগুলি বের করুন, আমি subsetফাংশনটি ব্যবহার করতে পছন্দ করি :

subset(airquality, Month == 8 & Temp > 90)

পরিবর্তে [ফাংশন:

airquality[airquality$Month == 8 & airquality$Temp > 90, ]

আমার পছন্দের জন্য দুটি প্রধান কারণ রয়েছে:

  1. আমি কোডটি বাম থেকে ডানে আরও ভাল পঠন করি। এমনকি যে লোকেরা আর সম্পর্কে কিছুই জানে না তারা subsetউপরের বিবৃতিটি কী করছে তা বলতে পারে ।

  2. যেহেতু কলামগুলি selectএক্সপ্রেশনটিতে পরিবর্তনশীল হিসাবে উল্লেখ করা যেতে পারে , আমি কয়েকটি কীস্ট্রোক সংরক্ষণ করতে পারি। উপরের আমার উদাহরণে, আমাকে কেবল airqualityএকবার দিয়ে টাইপ করতে হয়েছিল subset, তবে তিনবার দিয়ে [

সুতরাং আমি সুখী ছিলাম, subsetসর্বত্র ব্যবহার করেছিলাম কারণ এটি কম এবং আরও ভাল পড়া যায়, এমনকি এটি আমার সহকর্মী আর কোডারদের কাছে এর সৌন্দর্যের পক্ষেও। তবে গতকাল আমার সংসার ভেঙে গেছে। subsetডকুমেন্টেশন পড়ার সময় , আমি এই বিভাগটি লক্ষ্য করছি:

সতর্কতা

এটি ইন্টারেক্টিভভাবে ব্যবহারের উদ্দেশ্যে উদ্দেশ্যে করা একটি সুবিধাজনক ফাংশন। প্রোগ্রামিংয়ের জন্য [যেমন স্ট্যান্ডার্ড সাবসেটিং ফাংশনগুলি ব্যবহার করা ভাল, এবং বিশেষত যুক্তি উপসেটটির মানহীন মূল্যায়নের অপ্রত্যাশিত পরিণতি হতে পারে।

লেখকরা কী বোঝাতে চেয়েছেন তা বোঝাতে কেউ সাহায্য করতে পারে?

প্রথমত, ইন্টারেক্টিভভাবে ব্যবহারের জন্য "তারা কী বোঝায় ? ব্যাচ মোডে চালিত স্ক্রিপ্টের বিপরীতে আমি ইন্টারেক্টিভ সেশনটি কী তা জানি তবে এটির কী পার্থক্য হওয়া উচিত তা আমি দেখতে পাচ্ছি না।

তাহলে, আপনি দয়া করে " যুক্তি উপসেটটির মানহীন মূল্যায়ন " ব্যাখ্যা করতে পারেন এবং কেন এটি বিপজ্জনক, সম্ভবত একটি উদাহরণ সরবরাহ করতে পারেন?


14
এটা তোলে সঙ্গে ব্যবহার করার জন্য সামান্য কম (কিন্তু উপসেট কম বাদাম) হয়,with(airquality, airquality[Month == 8 & Temp > 90, ])
টিলার Rinker

7
আপনার কাছে 'দ্য আর ইনফার্নো' পোড়া
প্যাট্রিক বার্নস

9
এর পরিবর্তে ডেটা চেষ্টা করুন Try
স্টিয়ান হ্যাকলেভ

3
ঠিক আছে. সুতরাং যদি সাবসেটটি ব্যবহার করা খারাপ হয় - তবে [বনাম ডিপি্লায়ার :: ফিল্টার ()?
ব্যবহারকারীজেটি

4
যারা ভাবছেন তাদের dplyr::filterক্ষেত্রেও একই সমস্যা রয়েছে। উদাহরণস্বরূপ, যদি সেই পরিবেশটির সাথে সেই নামের সাথে কোনও ভেরিয়েবল হয়, তবে এটি ডেটা ফ্রেমের পরিবর্তকের পরিবর্তে এটি ব্যবহার করবে। বিভ্রান্তিকর ডিবাগিংয়ের জন্য তৈরি করে!
ডেলিট

উত্তর:


241

এই প্রশ্নটির উত্তর @ জেমসের মন্তব্যে ভালভাবে দেওয়া হয়েছিল, subset(এবং এটির মতো কার্যকারিতা) [এখানে] এর ঝুঁকিগুলির হ্যাডলি উইকহ্যামের দ্বারা একটি দুর্দান্ত ব্যাখ্যাটির দিকে ইঙ্গিত করে । এটি পড়ুন!

এটি কিছুটা দীর্ঘ পঠিত, সুতরাং এখানে হ্যাডলি যে উদাহরণটি ব্যবহার করেছেন এটি "কী ভুল হতে পারে?" - এর প্রশ্নটিকে সরাসরি সম্বোধন করে রেকর্ড করা সহায়ক হতে পারে:

হ্যাডলি নিম্নলিখিত উদাহরণটির পরামর্শ দিয়েছেন: মনে করুন আমরা সাবসেট করতে চাই এবং তারপরে নিম্নলিখিত ফাংশনগুলি ব্যবহার করে একটি ডেটা ফ্রেম পুনরায় অর্ডার করতে চাই:

scramble <- function(x) x[sample(nrow(x)), ]

subscramble <- function(x, condition) {
  scramble(subset(x, condition))
}

subscramble(mtcars, cyl == 4)

এটি ত্রুটি প্রদান করে:

আইওয়ালে ত্রুটি (এক্সপ্রেস, এনভির, এনক্লোস): অবজেক্ট 'সিল' পাওয়া যায় নি

কারণ আর 'সিল' নামক বস্তুটি কোথায় পাওয়া যায় তা আর "জানে না"। তিনি সত্যিকারের উদ্ভট জিনিসগুলিও উল্লেখ করেছেন যা ঘটনাক্রমে যদি বিশ্ব পরিবেশে 'সিল' নামে কোনও বস্তু থাকে তবে ঘটতে পারে:

cyl <- 4
subscramble(mtcars, cyl == 4)

cyl <- sample(10, 100, rep = T)
subscramble(mtcars, cyl == 4)

(এগুলি চালান এবং নিজের জন্য দেখুন, এটি বেশ পাগল))


2
আমার কি স্পষ্টতার জন্য কিছু নবাগত প্রশ্ন থাকতে পারে? যখন আমরা লিখি subset(mtcars, cyl == 4)(শীর্ষ স্তরে) তখন আর সিলের সন্ধান কোথায় করে? যদি এটি কোনও mtcarsবস্তুর কাছে প্রেরণ করা হয় subset()তবে এটি অন্য কোনও ফাংশনের মধ্যে থাকা cylসত্ত্বেও এটি সন্ধান করা উচিত নয় scramble, যেহেতু mtcarsএখনও এটি পাস করা হচ্ছে? যদি আমার প্রশ্নটি বোঝায় না, আপনি কেন আর আর খুঁজে পাচ্ছেন না সে সম্পর্কে আপনি আরও বিস্তারিত ব্যাখ্যা করতে পারেন cyl। ধন্যবাদ!
হাইজেনবার্গ

4
@Anh ইনসাইড subset.data.frame, জিনিস আমরা যে সময়ে মূল্যায়ন করার চেষ্টা করছেন ঠিক হয় condition। যে বিদ্যমান নেই mtcars। সুতরাং এটি সঠিকভাবে হিসাবে মূল্যায়ন করা হয় তা নিশ্চিত করতে subset.data.frameব্যবহার enclos = parent.frame()করে । তবে তারপরে আমরা এনকোলেসিং ফ্রেমে ফিরে এসেছি এবং এখন যখন আর এর সন্ধান করছে তখন আর ভিতরে খুঁজছেন না । আমরা যদি ব্যবহার না করি তবে এমন কিছু কাজ করা মোটেও কার্যকর হবে না। conditioncyl == 4cylmtcarsenclossubset(mtcars,cyl == a)
জোরান

কেউ কি জানেন যে কেন পর্দার পিছনে উপসেট () কেবলমাত্র দ্রুত এবং নিরাপদ [,] পদ্ধতি বাস্তবায়ন করবে না?
বজর্কস এক নম্বর ভক্ত

1
@ মাইকপ্যালামিস এটি করে। শেষ লাইন subset.data.frameহয় x[r, vars, drop = drop]। সমস্যাটি কীভাবে আপনি অবৈধভাবে subsetএবং বিতর্কগুলি থেকে এমন কোনও কিছুর দিকে পাবেন selectযা আপনি বৈধতার সাথে দিতে পারেন [.data.frame
21 ই

@ জোরান এটি পেয়েছে, ধন্যবাদ পরিবর্তে dplyr এর ফিল্টার ব্যবহার করবেন কিনা তা সম্পর্কে আপনি কীভাবে ভাবছেন []?
বজর্কস এক নম্বর ভক্ত 14 ই

30

এছাড়াও [দ্রুত:

require(microbenchmark)        
microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,])
    Unit: microseconds
                                                           expr     min       lq   median       uq     max neval
                     subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903   100
     airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058   100

36
হ্যা এবং না. আমার মনে হয় আপনি যে সময়ের পার্থক্যটি দেখছেন তা দুটি জিনিসের কারণে। 1) একটি ছোট (<100 মাইক্রোসেকেন্ড) ওভারহেড এবং 2) subsetঅসদৃশ [অপসারণ সারি যেখানে ফিল্টার মূল্যায়ণ করতে NA। এটি করুন এবং আপনি দেখতে পাবে যে তারা "মোটামুটি" তুলনা করার সময় উভয়ই তত দ্রুত:x <- do.call(rbind, rep(list(airquality), 100)); microbenchmark(subset(x, Month == 8 & Temp > 90),{ i <- x$Month == 8 & x$Temp > 90; x[!is.na(i) & i ,] })
ফ্লোডেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.