একাধিক ভেক্টর থেকে সাধারণ উপাদানগুলি কীভাবে সন্ধান করবেন?


159

যে কেউ আমাকে একাধিক ভেক্টর থেকে সাধারণ উপাদানগুলি কীভাবে খুঁজে পাবেন তা বলতে পারেন?

a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)

আমি উপরের ভেক্টরগুলির থেকে সাধারণ উপাদানগুলি পেতে চাই (উদা: 3 এবং 9)


45
cপরিবর্তনশীল নাম হিসাবে ব্যবহার করা ভাল ধারণা নয় ...
মেরেক

4
কেন এটি অন্যদের মতো একটি চিঠি?
মোস্তফা

12
@ দিমিত্রিপেট্রেনকো কারণ আপনি তালিকাটি তালিকাভুক্ত করতে পারেন c(1,2...)
ম্যাথিয়াস 711

উত্তর:


333

এটি সম্পর্কে একটি চালক উপায় থাকতে পারে, কিন্তু

intersect(intersect(a,b),c)

কাজ করবে

সম্পাদনা করুন: আপনার যদি প্রচুর যুক্তি থেকে থাকে তবে আরও চতুরতার সাথে এবং আরও সুবিধে করে:

Reduce(intersect, list(a,b,c))

16
+1 আমাদের Reduceসঠিক স্মরণ করিয়ে দেওয়ার জন্য এবং সঠিক আর মূলধন!
মারিওটোমো

8
এটি লক্ষণীয় যে intersectসেট অপারেশন জন্য। আপনার যদি ভেক্টরগুলিতে পুনরাবৃত্তি করার উপাদান থাকে তবে আপনি এই তথ্যটি হারাবেন কারণ ভেক্টরগুলি ছেদ করার আগে সেটগুলিতে পরিণত হয়েছিল। যেমন intersect(c(1,1,2,3), c(1,1,3,4))ফলাফল c(1,3)হতে পারে, এবং আপনি ফলাফল চেয়েছিলেন হতে পারে c(1,1,3)
গিওরা সিমচনি

1
@ জিওরাসিমচোনি আপনি কীভাবে সিটি পেতে পারেন (1,1,3), যদি সত্যিই আপনি চান তা কি?
স্ট্যাটাসস্রেস্রেস

@ স্ট্যাটসরাস্রেস ধরুন আপনি একটি তালিকাতে সমস্ত ধনাত্মক পূর্ণসংখ্যার সমন্বিত ভেক্টরগুলির "ছেদগুলি সংরক্ষণের নকলগুলি চান" চান। নীচের কোডটি কাজ করে: N <- max(unlist(L)); LT <- lapply(L, tabulate, nbins = N); v <- do.call(pmin, LT); unlist(sapply(1:N, function(x) rep(x, v[x]))) আরেকটি উপায় ব্যবহার করবেmatch ভেক্টর প্রতিটি iteratively এই মুছে ফেলার জন্য নেতিবাচক subscripting সহ ফাংশন প্রতিটি উপাদান "কার্নেল" এ যুক্ত হয়।
মন্টগোমেরি ক্লিফ্ট

24

ইতিমধ্যে একটি ভাল উত্তর, তবে এটি করার আরও কয়েকটি উপায় রয়েছে:

unique(c[c%in%a[a%in%b]])

বা,

tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]

আপনি অবশ্যই বাদ দিতে পারেন unique কলগুলি পারেন তবে আপনি জানেন যে এর মধ্যে কোনও পুনরাবৃত্তি মান নেই a, bবা c


7
intersect_all <- function(a,b,...){
  all_data <- c(a,b,...)
  require(plyr)
  count_data<- length(list(a,b,...))
  freq_dist <- count(all_data)
  intersect_data <- freq_dist[which(freq_dist$freq==count_data),"x"]
  intersect_data
}


intersect_all(a,b,c)

আপডেট সম্পাদনা করুন একটি সহজ কোড

intersect_all <- function(a,b,...){
  Reduce(intersect, list(a,b,...))
}

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