एकाधिक वैक्टर से सामान्य तत्व कैसे खोजें?


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चर नाम के रूप में उपयोग करना एक अच्छा विचार नहीं है ...
Marek

4
यह दूसरों की तरह एक पत्र क्यों है?
मुस्तफा

12
@DimitriPetrenko क्योंकि आप के साथ सूचियों की घोषणा कर सकते हैं 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
@GioraSimchoni आप कैसे ग (1,1,3) प्राप्त कर सकते हैं, यदि वास्तव में आप क्या चाहते हैं?
स्टैटसॉरसस

@StatsSorceress मान लीजिए कि आप सकारात्मक पूर्णांक से मिलकर वैक्टर के "प्रतिच्छेदन डुप्लिकेट को संरक्षित करना" चाहते हैं, सभी एक सूची में एल। निम्नलिखित कोड काम करता है: 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फ़ंक्शन को नकारात्मक सबस्क्रिप्टिंग के साथ उपयोग करके प्रत्येक वैक्टर से इसे हटा दिया जाए। हर तत्व को "कर्नेल" में जोड़ा जाता है।
मॉन्टगोमरी क्लिफ्ट

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.