2011-04-26 16 views
12

यदि मैं आर में डेटा का सबसेट चुनना चाहता हूं, तो मैं सबसेट फ़ंक्शन का उपयोग कर सकता हूं। मैं डेटा पर एक विश्लेषण का आधार बनाना चाहता था कि वह कुछ मानदंडों में से एक से मेल खाता था, उदा। एक निश्चित चर या तो 1, 2 या 3 मैंसबसेट फ़ंक्शन और लॉजिकल ऑपरेटरों में एकाधिक मानदंडों का उपयोग

myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3))) 

यह हमेशा सिर्फ चुनिंदा मान होते हैं, मापदंड के पहले यहां मिलान किया किया था की कोशिश की थी कि 1. मेरे धारणा थी कि यह 1 के साथ और अगर शुरू होगा यह "झूठी" का मूल्यांकन करता है, यह 2 और 3 से 3 तक चलता है, और यदि कोई भी == "झूठी" के बाद कथन से मेल नहीं खाता है और यदि उनमें से कोई मेल खाता है, तो यह "सत्य" है।

मैं

newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3))) 

लेकिन मैं, इसलिए तार्किक ऑपरेटरों के माध्यम से डेटा का चयन करने में सक्षम होना चाहते हैं का उपयोग कर सही परिणाम मिला: क्यों पहले दृष्टिकोण काम नहीं किया?

+0

लॉजिक सहायता पृष्ठ पर एक नज़र डालें। '||' फॉर्म बाएं से दाएं संचालित होता है और केवल वेक्टर में पहले तत्व की जांच करता है। इन स्थितियों में उपयोग करने के लिए '% में%% भी सहायक सहायक ऑपरेटर होगा। '% में% [%]% के लिए एक एसओ खोज प्रबुद्ध होना चाहिए। – Chase

+2

@ चास '||' और '| 'यहां बेकार हैं:' 1 || 2 || 3' और '1 | 2 | 3' सत्य का मूल्यांकन करते हैं, इसलिए सबसेट में केवल उन लोगों को शामिल किया जाएगा जहां' bf11' सत्य था (या कुछ ऐसा जो TRUE का मूल्यांकन करता है)। %% में%% यहां सहायक से अधिक है। –

+0

@ गैविन - मेरी सजा पूरी करने के लिए धन्यवाद - एक और बैठक में भागना पड़ा। – Chase

उत्तर

19

सही ऑपरेटर %in% है। यहाँ डमी डेटा के साथ एक उदाहरण है:

set.seed(1) 
dat <- data.frame(bf11 = sample(4, 10, replace = TRUE), 
        foo = runif(10)) 

देने:

> head(dat) 
    bf11  foo 
1 2 0.2059746 
2 2 0.1765568 
3 3 0.6870228 
4 4 0.3841037 
5 1 0.7698414 
6 4 0.4976992 

dat के सबसेट जहां bf11 के बराबर होती है सेट 1,2,3 के किसी भी रूप में %in% का उपयोग कर इस प्रकार लिया जाता है:

> subset(dat, subset = bf11 %in% c(1,2,3)) 
    bf11  foo 
1  2 0.2059746 
2  2 0.1765568 
3  3 0.6870228 
5  1 0.7698414 
8  3 0.9919061 
9  3 0.3800352 
10 1 0.7774452 

क्यों आपका मूल काम नहीं करता है, समस्या को देखने के लिए इसे तोड़ दें। क्या 1||2||3 का मूल्यांकन को देखो:

> 1 || 2 || 3 
[1] TRUE 

और आप के बजाय | का उपयोग कर एक ही प्राप्त होगी। नतीजतन, subset() कॉल केवल पंक्तियों को वापस करेगा जहां bf11TRUE था (या कुछ ऐसा जो TRUE पर मूल्यांकन किया गया था)।

subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3) 

कौन मेरे पहले subset() फोन के रूप में एक ही परिणाम देता है:

आप क्या लिख ​​सकता की तरह कुछ हो गया होता। मुद्दा यह है कि आपको विकल्पों की एक श्रृंखला की तुलना नहीं, एकल तुलना की एक श्रृंखला की आवश्यकता है।लेकिन जैसा कि आप देख सकते हैं, %in% ऐसी परिस्थितियों में कहीं अधिक उपयोगी और कम वर्बोज़ है। ध्यान दें कि मुझे | का उपयोग करना है क्योंकि मैं के प्रत्येक तत्व की तुलना 1, 2, और 3 के बदले में करना चाहता हूं। तुलना करें:

> with(dat, bf11 == 1 || bf11 == 2) 
[1] TRUE 
> with(dat, bf11 == 1 | bf11 == 2) 
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE 
+0

मैं "%%%" के बारे में सहायता पृष्ठ कैसे ढूंढ सकता हूं? मैंने% में% का उपयोग किया लेकिन यह काम नहीं किया। – kostia

+2

@ कोस्टिया ऑपरेटर उद्धरण: कुछ '%'%% में '' –

4

अपने उदाहरण के लिए, मेरा मानना ​​है कि निम्नलिखित काम करना चाहिए:

myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3) 

अधिक के लिए ?subset में उदाहरण देखें। बस प्रदर्शित करने के लिए, एक और अधिक जटिल तार्किक सबसेट होगा:

data(airquality) 
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40) 

और जैसा कि चेस बताते हैं, %in% अपने उदाहरण में और अधिक कुशल होगा:

myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3)) 

चेस यह भी बताता है के रूप में, आप यह सुनिश्चित कर लें | और || के बीच अंतर को समझें। ऑपरेटरों के लिए सहायता पृष्ठ देखने के लिए, ?'||' का उपयोग करें, जहां ऑपरेटर उद्धृत किया गया है।

+0

'? '||' 'आर में ठीक काम करता है, करता है '? "||"। मुद्दा यह है कि इन ऑपरेटरों और कुछ अन्य संरचनाओं को _quoted_ होना चाहिए। इसलिए आपके उत्तर से वाक्यों को हटाने। –

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