2012-01-18 10 views
8

कोई मुझे बता सकते हैं कि आर में यह करता है, तो-और कुछ पाश के साथ गलत क्या है? मैं अक्सर काम नहीं कर सकता अगर-और काम करने के लिए loops।सरल करता है, तो-और कुछ अनुसंधान में पाश

if(match('SubjResponse',names(data))==NA) { 
    observed <- data$SubjResponse1 
} 
else { 
    observed <- data$SubjResponse 
} 

ध्यान दें कि data एक डेटा फ्रेम है: मैं कोई त्रुटि मिलती है।

त्रुटि

Error in if (match("SubjResponse", names(data)) == NA) { : 
    missing value where TRUE/FALSE needed 

उत्तर

2

रूप @DirkEddelbuettel बताया गया है, आपको लगता है कि जिस तरह से NA परीक्षण नहीं कर सकते। लेकिन आप कर सकते हैं matchNA वापस नहीं:

nomatch=0 का उपयोग करने और if खंड पीछे (के बाद से 0FALSE के रूप में व्यवहार किया जाता है) के द्वारा, कोड को सरल बनाया जा सकता है। इसके अलावा, एक और उपयोगी कोडिंग मुहावरा

तो मैं इसे इस तरह लिखना चाहते हैं, तो खंड, इस तरह आप शाखाओं में से एक में चर नाम गलत टाइप नहीं होगा का परिणाम आवंटित करने के लिए है ...:

observed <- if(match('SubjResponse',names(data), nomatch=0)) { 
    data$SubjResponse # match found 
} else { 
    data$SubjResponse1 # no match found 
} 

तरह से यदि आप "अक्सर" अगर-नहीं, तो आप दो चीजों के बारे में पता होना चाहिए साथ कोई समस्या है द्वारा:

  1. परीक्षण करने के लिए वस्तु एनए या NaN, शामिल नहीं करना चाहिए या होना एक स्ट्रिंग (मोड कैरेक्टर) या कुछ अन्य प्रकार जिन्हें लॉजिकल वैल्यू में नहीं जोड़ा जा सकता है। संख्यात्मक ठीक है: 0 FALSE कुछ और है (लेकिन NA/NaN) TRUE है।

  2. वस्तु की लंबाई वास्तव में 1 (एक अदिश मूल्य) होना चाहिए। यह लंबा हो सकता है, लेकिन फिर आपको एक चेतावनी मिलती है। यदि यह छोटा है, तो आपको एक त्रुटि मिलती है।

उदाहरण:

len3 <- 1:3 
if(len3) 'foo' # WARNING: the condition has length > 1 and only the first element will be used 

len0 <- numeric(0) 
if(len0) 'foo' # ERROR: argument is of length zero 

badVec1 <- NA 
if(badVec1) 'foo' # ERROR: missing value where TRUE/FALSE needed 

badVec2 <- 'Hello' 
if(badVec2) 'foo' # ERROR: argument is not interpretable as logical 
7

यह एक पूर्ण उदाहरण हम डेटा नहीं है के रूप में नहीं है, लेकिन मैं इन मुद्दों देखें:

  1. आप नहीं कर सकते == साथ NA के लिए परीक्षण, आप is.na()
  2. इसी
  3. , match() और दोस्तों के उत्पादन की जरूरत है आम तौर पर शून्य याके लिए परीक्षण किया जाता है
  4. मैं एक लाइन पर } else { लिखने के लिए करते हैं।
+0

'match' * हमेशा * पहला तर्क (' x') के रूप में ही लंबाई का एक वेक्टर वापस आ जाएगी। तो इस मामले में, हमेशा एक स्केलर मूल्य। – Tommy

+0

'आर इन्फर्नो' के सर्किल 8.1.4 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –

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