"OR" का उपयोग करके डेटा-फ़्रेम को कम करने के लिए कई स्थितियों को कैसे संयोजित करें?


174

मेरे पास R में एक डेटा है। मैं दो अलग-अलग कॉलम पर दो अलग-अलग स्थितियों को आज़माना चाहता हूं, लेकिन मैं चाहता हूं कि ये स्थितियाँ समावेशी हों। इसलिए, मैं शर्तों को संयोजित करने के लिए "OR" का उपयोग करना चाहूंगा। जब मैंने "और" स्थिति का उपयोग करना चाहा तो मैंने बहुत सफलता के साथ निम्नलिखित वाक्य रचना का उपयोग किया है।

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]

लेकिन मुझे नहीं पता कि उपरोक्त में 'OR' का उपयोग कैसे किया जाता है।

जवाबों:


249
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

एक वैकल्पिक समाधान जो इस फ़ंक्शन के व्यवहार की नकल करता है और एक फ़ंक्शन बॉडी में शामिल करने के लिए अधिक उपयुक्त होगा:

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]

कुछ लोग whichआवश्यकतानुसार उपयोग न करने की आलोचना करते हैं , लेकिन यह NAमूल्यों को अवांछित परिणामों को वापस फेंकने से रोकता है । दो (बिना वी 1 या वी 2 में से किसी के लिए एनए-पंक्तियों को वापस नहीं करना) समतुल्य whichहोगा। निम्न विकल्प निम्न होंगे:

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

नोट: मैं उस गुमनाम योगदानकर्ता का शुक्रिया अदा करना चाहता हूं जिसने कोड में त्रुटि को तुरंत ठीक करने का प्रयास किया, एक ऐसा संशोधन जो मॉडर्नाइजर्स द्वारा खारिज कर दिया गया। वास्तव में एक अतिरिक्त त्रुटि थी जिसे मैंने देखा जब मैं पहले वाले को सही कर रहा था। सशर्त खंड जो NA मानों की जांच करता है, उसे पहले करने की आवश्यकता होती है, क्योंकि इसे तब तक संभाला जाना चाहिए जैसा कि मैं चाहता था, जब से ...

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

तर्कों का क्रम 'और' का उपयोग करते समय मायने रखता है।


1
यह सबसे अधिक मतदान वाला सवाल है और फिर कोई पाता है: stackoverflow.com/questions/9860090/…
पैट्रिकटी

1
फायदा कॉम्पैक्टनेस और कॉम्प्रिहेंशन का आसान है। नुकसान कार्य निर्माण कार्यों में उपयोगिता की कमी है। एक के साथ इस को दोहराने के लिए चाहता है [में रैप करने के लिए एक की जरूरत है whichया अतिरिक्त का उपयोग !is.naकी कमी।
IRTFM

क्या 'जो' की आवश्यकता है और यदि आप इसका उपयोग क्यों नहीं करते हैं?
क्लेब जूल

1
यह "आवश्यक" नहीं है, लेकिन यदि आप बाहर निकलते हैं तो आपको एक अलग परिणाम मिल सकता है which। यदि V1 और V2 दोनों NA हैं, तो आपको उस स्थान पर NA की एक पंक्ति मिल जाएगी यदि आपने छोड़ दिया which। मैं बड़े डेटासेट के साथ काम करता हूं और यहां तक ​​कि एनए का अपेक्षाकृत छोटा प्रतिशत वास्तव में मेरी स्क्रीन को जंक आउटपुट से भर देगा। कुछ लोगों को लगता है कि यह एक विशेषता है। मैं नही।
IRTFM

आप इन शर्तों के अलावा वांछित पंक्तियों के लिए पैटर्न मिलान करने के लिए greplया इसके grepसाथ एक कॉल कैसे शामिल करते हैं?
user5359531


17

पूर्णता के लिए, हम ऑपरेटरों का उपयोग कर सकते हैं [और [[:

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

कई विकल्प

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]

df $ नाम df [["नाम" के बराबर है , सटीक = FALSE]]

का उपयोग कर dplyr:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

का उपयोग कर sqldf:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

उपरोक्त विकल्पों के लिए आउटपुट:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j

1
आप उदाहरण के लिए 1 और हालत और 3 या परिस्थितियों के लिए ऐसा कैसे करेंगे: my.data.frame <- डेटा [डेटा $ V3> 10 & ((डेटा $ V1> 2) |) (डेटा $ V2 <4)। (डेटा $ V4 <5),]। जब मैं ऐसा करता हूं तो यह काम नहीं करता है
R गुरु

1
वाह! sqldfपैकेज भी अच्छा है। विशेष रूप से बहुत उपयोगी है जब subset()थोड़ा दर्दनाक हो जाता है :)
Dawny33
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.