2012-03-02 13 views
5

मैं इस तरह एक data.frame है:आर में, क्या डेटा.फ्रेम के पूर्णांक कॉलम में NA को संभालने का कोई तरीका है ताकि सबसेटिंग के दौरान NA मान शामिल न हों?

(t=structure(list(count = c(NA, 2, NA, NA, NA, 8, NA, NA, NA)), .Names = "count", row.names = c(NA,-9L), class = "data.frame")) 
    count 
1 NA 
2  2 
3 NA 
4 NA 
5 NA 
6  8 
7 NA 
8 NA 
9 NA 

यह आर एनए मूल्य होता है महान है, लेकिन कभी कभी यह मेरे काटता है। मैं अक्सर इसके बारे में भूल जाता हूं और इस

> t[t$count>=1,] 
[1] NA 2 NA NA NA 8 NA NA NA 

और आउटपुट में सभी एनए पंक्तियां शामिल हैं। (जो मुझे पसंद नहीं है)

बग खोज के एक घंटे के बाद मैं इस कोड को बदलता हूं और यही वह है जो मैं चाहता हूं (बड़े डेटाफ्रेम बहुत सारे गैर-एनए resuls और केवल कुछ "छिपे हुए"

टी [as.integer.EXCLUDE.NA: इतना है कि मैं इस तरह कुछ कर सकते हैं as.integer "समारोह:" NAS)

> t[t$count>=1&!is.na(t$count),] 
[1] 2 8 

1. वहाँ की एक विशेषता है " (टी $ गिनती)> = 1,]

मैं इस तरह की सुविधा को अन्य XXXXX कार्यों में भी उपयोग करना चाहता हूं। मूल रूप से आर एक सांख्यिकीविद् की तरह लगता है बंद करो और एनए को अलग ढंग से इलाज (करने के लिए मजबूर जैसे, शून्य की तरह (मैं कर रहा हूँ नहीं यकीन है कि शून्य मेरी समस्या का समाधान हो जाएगा) (यह काम नहीं किया: टी $ गिनती [3] किसी कारण से < -NULL)

2. या मैं

transform(t, replace all NAs from count columns with 0) 

या और भी बेहतर कैसे चल पाएंगे

transform(t, replace all NA from all numeric columns with 0 in t) 

3. आर भूल के बारे में NAS स्वागत कर रहे हैं बनाने के लिए किसी भी सामान्य टिप्पणी?

+0

मैं NAS का मूल्य देखते हैं, लेकिन वहाँ डेटा सेट जहां NAS स्वागत नहीं कर रहे हैं। – userJT

+1

लेकिन आप उन्हें कैसे संभालना चाहते हैं - प्रत्येक एनए ड्रॉप करें? प्रत्येक पंक्ति को छोड़ दें जहां कोई एनएएस है? उन्हें प्रभावित करें? यह एक वास्तविक निर्णय है। –

उत्तर

6

मैं से अधिक आसान है विकल्पों पर किए गए थे पसंद नहीं है डिजाइन करने का समय "[" एनए मानों को कैसे संभालता है। जब मैं लॉजिकल टेस्ट का उपयोग करके मूल्य निकालना चाहता हूं तो दृष्टिकोण which में तार्किक अभिव्यक्ति को लपेटना है। यह संख्याओं के एक समूह के लिए परिणाम धर्मान्तरित और अनुक्रमण अवांछित एनए के साथ खींच के बिना सफल होता है:

> t[ which(t$count >= 1), ] 
[1] 2 8 
# Or if you still want a dataframe result 
> t[ which(t$count >= 1), , drop=FALSE] 
    count 
2  2 
6  8 

मैं भी subset का उपयोग के बाद से यह संभालती एनए के which(logical) के रूप में एक ही तरीके से। एक गोचाचा है जब which पूरक सेट को पुनः प्राप्त करने के लिए "-" चिह्न के साथ प्रयोग किया जाता है। यदि लॉजिकल-हालत को संतुष्ट करने वाले सेट में कोई तत्व नहीं है, तो -which(logical) -form में कोई भी तत्व नहीं होगा। तो मैं सिर्फ -which कॉम्बो का उपयोग नहीं करते:

> t[ -which(t$count < 1), , drop=FALSE] 
[1] count 
<0 rows> (or 0-length row.names) 
> t[ which(t$count < 1), , drop=FALSE] 
[1] count 
<0 rows> (or 0-length row.names) 
+0

में देखने के लिए एक और आवेग मैंने सबसेट() का उपयोग किया और फिर [] से स्विच किया क्योंकि यह तेज़ था। लेकिन कुछ मामलों में आपके उत्तरों सबसेट() पर वापस जाने के लिए एक महान बिंदु बनाता है – userJT

3

पर्याप्त आराम से (2) की सूची में ऐसा करने के लिए (सभी NAS डालें):

t$count[is.na(t$count)] <- something.else 

सवाल है, ज़ाहिर है, क्या आप में something.else के लिए डाल दिया है। किसी समस्या को हल करने के लिए एनएएस मौजूद हैं। यदि आप उन्हें आर के उपयोग से कंबल करना चाहते हैं, तो आपको यह पता लगाना होगा कि आप लापता अवलोकन के साथ क्या करना चाहते हैं, इसके अलावा उन्हें लापता होने के अलावा।

एनए की सुंदरता आम तौर पर आपके विश्लेषण के अंत में आपको इंगित करती है कि कहीं कहीं आपके पास कुछ लापताता है जिसे आप बेहतर समझना चाहते हैं। लापता होने के बारे में सोचने के लिए कोई विकल्प नहीं है।

+1

+1 आपकी व्याख्या के लिए, और एनएएस में सुंदरता देखने में सक्षम होने के लिए :) –

+0

यदि ज्ञान के मार्ग पर पहला कदम त्रुटि संदेशों के अस्तित्व से खुश है, और दूसरा कदम एनएएस में सुंदरता देख रहा है, तो क्या है तीसरा कदम? –

+0

आह! एक आर [कोन] (http://en.wikipedia.org/wiki/K%C5%8Dan)। धन्यवाद! –

5

data.table में यह काम करता है कि आप इसे पसंद w.r.t. लिए चाहते हैं के रूप में NA, अगर मैं सही ढंग से समझता हूं। इसके अलावा, आप $ उपयोग करने की आवश्यकता नहीं है और यह मन नहीं करता है अगर आप अल्पविराम भूल जाते हैं, या तो।

dt = as.data.table(t) 
t[count>=1] # NA's are treated as FALSE 

data.table और data.frame के बीच मतभेद की सूची पूछे जाने वाले प्रश्न 2.17 here में है।

यदि आप सोच रहे हैं कि ये सभी अंतर संगतता तोड़ते हैं, तो वे नहीं करते हैं।आप अभी भी किसी भी पैकेज में data.table पास कर सकते हैं और जब वे पैकेज data.table पर मानक आर सिंटैक्स का उपयोग करते हैं, तो यह अभी भी काम करता है।

चूंकि आपने कहा है कि बड़ेdata.frame, data.table वैसे भी एक लायक हो सकता है।

ये पूछे जाने वाले प्रश्न 2.17 से 3 अंक हैं (जहां DT मतलब है data.table और DF मतलब है data.frame):

  • DT[NA] रिटर्न NA की 1 पंक्ति, लेकिन DF युक्त NA की पूरी की एक प्रति DF[NA] रिटर्न भर। प्रतीक NA आर में तार्किक प्रकार है, और इसलिए [.data.frame द्वारा पुनर्नवीनीकरण किया गया है। इरादा शायद DF[NA_integer_] था। [.data.table यह स्वचालित रूप से सुविधा के लिए करता है।

  • DT[c(TRUE,NA,FALSE)] व्यवहार करता है NAFALSE के रूप में है, लेकिन DF[c(TRUE,NA,FALSE),] रिटर्न एक NA प्रत्येक NA

  • DT[ColA==ColB] के लिए पंक्ति DF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]

+0

Thx। फिर भी डेटाटेबल – userJT

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