একটি ডেটা ফ্রেম ফিল্টার করা হচ্ছে


12

এখনও আর-তে বেসিক ফাংশনগুলি শিখছে, সাবসেট ফাংশনটি একক কলামের উপর ভিত্তি করে একাধিক শর্ত ছাড়াই বা কেবল ছাড়াই কেবল একটি শর্ত ফিল্টার করে বলে মনে হচ্ছে?

ডেটা ফ্রেম থেকে কীভাবে আমি সহজেই ডেটা ফিল্টার করতে পারি?

  1. আপনি একাধিক শর্ত সঙ্গে সরবরাহ করা হয় যখন

  2. যখন শর্তটি উপলব্ধ কলামগুলি জুড়ে প্রয়োগ করা দরকার।

উদাহরণ: সমন্বিত একটি ডেটা ফ্রেম দেওয়া

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

বলুন আমি এই ডেটাফ্রেমটি ফিল্টার করতে চাই যাতে কেবলমাত্র নাম যেখানে ডি 1 থেকে ডি 4 এর কোনও একটি 'ই' থাকে তবে আমার থাকা উচিত,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

বলুন যে ডি 1 কলামগুলির একটি বড় তালিকা হতে পারে, এই ফিল্টারটি সম্পাদন করার প্রস্তাবিত পদ্ধতির কীভাবে বা কী? ধন্যবাদ

উত্তর:


26

আপনি যদি সাবসেট ফাংশনে বেশ কয়েকটি ফিল্টার একত্রিত করতে চান তবে লজিকাল অপারেটরগুলি ব্যবহার করুন:

 subset(data, D1 == "E" | D2 == "E")

সেই সারিগুলি নির্বাচন করবে যার জন্য কলাম D1 বা কলাম D2 এর মান "E" রয়েছে। লজিক্যাল অপারেটরগুলির জন্য সহায়তা পৃষ্ঠাগুলি দেখুন:

 > ?"|"

আপনার দ্বিতীয় প্রশ্নের জন্য আপনার যা প্রয়োজন তা হল সারিগুলি ফিল্টার করা। এটি নিম্নলিখিত উপায়ে অর্জন করা যেতে পারে

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

প্রয়োগ করার জন্য প্রথম যুক্তি আমাদের যে কলামগুলিকে ফিল্টার করতে হবে তা সরবরাহ করে। দ্বিতীয় যুক্তিটি হ'ল 1, এর অর্থ হ'ল আমরা ডাটাগুলির সারিগুলির মধ্য দিয়ে লুপ করছি। তৃতীয় আর্গুমেন্টটি নামবিহীন এক-লাইন ফাংশন যা "E" সারিটিতে উপস্থিত থাকলে সত্য এবং "E" উপস্থিত না থাকলে FALSE প্রদান করে।

প্রয়োগ ফাংশনের ফলাফলটি লজিক্যাল ভেক্টর সেল হবে , যার দৈর্ঘ্য ডেটাতে সারিগুলির সংখ্যার সমান। এরপরে প্রয়োজনীয় সারিগুলি নির্বাচন করতে আমরা এই ভেক্টরটি ব্যবহার করি।

হালনাগাদ

গ্রেপ দিয়ে একই অর্জন করা যায়:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

আর গ্রেপ-এ ডিফল্ট আর্গুমেন্ট সহ সরবরাহ করা ভেক্টরগুলির মিলগুলির প্যাটার্ন রয়েছে এমন উপাদানগুলির সংখ্যা প্রদান করে।


2
আরেকটি দরকারী ফাংশন হয় any। উদাহরণস্বরূপ আপনি যদি ভেক্টরের কমপক্ষে একটি উপাদানটি পরীক্ষা করতে চান তবে আপনি = 10( any(v==10)) লিখতে পারেন ।
নিকো

@ নিকো হ্যাঁ, তবে % ভি- তে 10% এর 9 টি অক্ষর এবং যে কোনও 10 এর সাথে বৈকল্পিক রয়েছে :)। যদিও সংখ্যার ভেক্টরগুলির জন্য এটি সমতা ব্যবহার করা ভাল, যেহেতু আর স্মার্ট হয় এবং আপনার ডেটাটি যদি সংখ্যার সাথে প্রকৃত সংখ্যার সাথে মিশে থাকে তবে এটি সঠিকভাবে বুঝতে পারবে যে আপনার ডেটা সেটটিতে 10 রয়েছে।
এমপিক্টাস

নিয়মিত প্রকাশের ক্ষেত্রে কী হবে? ধরে নিচ্ছি যে আপনি একটি সঠিক ম্যাচ নিয়ে কাজ করতে চান না? অন্যান্য ভাষায় যেমন তাদের কাছে to = এর কাছাকাছি কিছু রয়েছে? আর
ইস্টাফ্রি

পিজিক্স 1003.2 বা পার্ল-সামঞ্জস্যপূর্ণ রেজেক্সে বায়োরিলেটেড দেখুন grepএবং agrepসম্পর্কিত ডকুমেন্টেশন।
chl

@ বায়োরিলেটেড, আমি গ্রেপের উদাহরণ সহ উত্তরটি আপডেট করেছি।
এমপিটকাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.