2012-03-12 27 views
84

मैं की तरह एक वेक्टर है: a = c(1:10) और मैं, एक से अधिक मान हटाने की जरूरत की तरह: 2, 3, 5वेक्टर से कई मान कैसे हटाएं?

कैसे उन संख्याओं को नष्ट करने के लिए वेक्टर में (वे वेक्टर में पदों के नहीं हैं)?

पल मैं पाश वेक्टर पर

और की तरह कुछ कार्य करें:

a[!a=NUMBER_TO_REMOVE] 

लेकिन मुझे लगता है एक समारोह है कि यह स्वचालित रूप से करता है।

उत्तर

140

%in% ऑपरेटर आप जो तत्वों numers में से एक हैं दूर करने के लिए कहता है:

> a <- sample (1 : 10) 
> remove <- c (2, 3, 5) 
> a 
[1] 10 5 2 7 1 6 3 4 8 9 
> a %in% remove 
[1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE 
> a [! a %in% remove] 
[1] 10 7 1 6 4 8 9 
16
x <- list("a", "b", "c", "d", "e"); # example list 

x[-2];  # without 2nd element 

x[-c(2, 3, 5)]; # without 2nd,3rd,5th element 
+16

उन्होंने विशेष रूप से उल्लेख किया "वे वेक्टर में पद नहीं हैं" – jpd527

+7

यह उत्तर हटा दिया जाना चाहिए। यह सवाल का जवाब नहीं देता है। –

65

आप setdiff उपयोग कर सकते हैं।

को देखते हुए

a <- sample(1:10) 
remove <- c(2, 3, 5) 

फिर

> a 
[1] 10 8 9 1 3 4 6 7 2 5 
> setdiff(a, remove) 
[1] 10 8 9 1 4 6 7 
+1

बहुत उपयोगी होता है जब 'ए' किसी अन्य फ़ंक्शन का नतीजा होता है ताकि आप 3 की बजाय एक पंक्ति में चीजें कर सकें और एक अस्थायी चर – jf328

+6

इनपुट इनपुट वेक्टर में डुप्लिकेट होने पर यह%% समाधान में '% से अधिक परिणाम देगा) कौन सा मामला 'setdiff' केवल अद्वितीय _set_ लौटाएगा, यानि डुप्लिकेट के बिना) –

+0

@ डॉकेंडोडिस्किमस: 'data.table' पैकेज के' fsetdiff' में' all' flag (डिफ़ॉल्ट F) है जो इनपुट वेक्टर में डुप्लिकेट रखने की अनुमति देता है। – Juergen

5

आप इसे इस रूप में कर सकते हैं:

> x<-c(2, 4, 6, 9, 10) # the list 
> y<-c(4, 9, 10) # values to be removed 

> idx = which(x %in% y) # Positions of the values of y in x 
> idx 
[1] 2 4 5 
> x = x[-idx] # Remove those values using their position and "-" operator 
> x 
[1] 2 6 

कुछ ही समय

> x = x[ - which(x %in% y)] 
+1

जो आप अपने उदाहरण में एक सूची बुला रहे हैं वह एक वेक्टर है, है ना? – patrick

+0

हाँ मेरा मतलब वेक्टर है। टिप्पणी के लिए धन्यवाद। – ykpemre

+0

यहां 'किस' की कोई आवश्यकता नहीं है। यह मूल रूप से @cbeleites उत्तर के समान है। –

1

अद्यतन:

full_vector[!full_vector %in% searched_vector | duplicated(full_vector)] 

मूल उत्तर:: यहाँ मैं एक लिखने

ऊपर सभी उत्तर दोहराया मूल्यों के लिए काम नहीं करेगा, @duplicated() विधेय का उपयोग कर BenBolker का जवाब इस को हल करती है इस के लिए थोड़ा समारोह:

exclude_val<-function(full_vector,searched_vector){ 

     found=c() 

     for(i in full_vector){ 

     if(any(is.element(searched_vector,i))){ 
      searched_vector[(which(searched_vector==i))[1]]=NA 
     } 
     else{ 
      found=c(found,i) 
     } 
    } 

    return(found) 
} 

हां, तो मान लीजिए कि full_vector=c(1,2,3,4,1) औरजाने।

exclude_val(full_vector,searched_vector) वापस लौटाएगा (4,1), हालांकि उत्तर से ऊपर (4) वापस आ जाएगा।

+1

'full_vector [! Full_vector%% search_vector में 'के बारे में क्या है। डुप्लिकेट (full_vector)] '? –

+0

@ बेनबॉल्कर आह मुझे नहीं पता था कि "डुप्लिकेट" अनुमानित है: ((अब, क्या मैं अपना जवाब हटा दूंगा या इसे बदले में बदल सकता हूं? –

+1

मेरी टिप्पणी को शामिल करने के लिए आपका उत्तर संपादित करने के लिए आपका स्वागत है। –

2

पहले हम एक नए ऑपरेटर को परिभाषित कर सकते,

"%ni%" = Negate("%in%") 

फिर, अपनी तरह एक्स में

x <- 1:10 
remove <- c(2,3,5) 
x <- x[ x %ni% remove ] 

या क्यों नहीं निकाल निकालने के लिए जाने के लिए, जाना सीधे

x <- x[ x %ni% c(2,3,5)] 
+3

प्रश्न विशेष रूप से कहता है कि 2, 3 और 5 वेक्टर में स्थित नहीं हैं। – blakeoft

1

x <- x[! x %in% c(2,3,5)] 
0 के बजाय

संकुल purrr और margrittr उपयोग कर, आप कर सकते हैं:

your_vector %<>% discard(~ .x %in% c(2,3,5)) 

यह केवल एक बार वेक्टर नाम का उपयोग subsetting के लिए अनुमति देता है। और तुम पाइप :)

+0

क्या आप चर नामों की लंबाई के बारे में अपने अंतिम बयान को समझा सकते हैं? आप क्यों नहीं करते ' टी ऐसा क्यों है? दूसरी तरफ से बेहतर क्यों है? या, उस पैराग्राफ को हटाएं क्योंकि मुख्य मुद्दे/प्रश्न से संबंधित नहीं है । – rodrigoap

0
q <- c(1,1,2,2,3,3,3,4,4,5,5,7,7) 
rm <- q[11] 
remove(rm) 
q 
q[13] = NaN 
q 
q %in% 7 

यह एक सदिश में 13 सेट में उपयोग कर सकते हैं करने के लिए नहीं एक नंबर (नेन) यह गलत निकालें (क्यू [ग (11,12,13)]) अगर पता चलता आप इसे आज़माएं, आप देखेंगे कि फ़ंक्शन निकालें वेक्टर नंबर पर काम नहीं करते हैं। आप पूरे वेक्टर को हटाते हैं लेकिन शायद एक तत्व नहीं।

+0

कुछ बहुत आसान काम के लिए बहुत काम करता है। –

संबंधित मुद्दे