2012-06-29 14 views
70

के विशिष्ट स्तंभ युक्त पंक्तियों मुझे पता है कि एक डेटा फ्रेम में NA मूल्यों को छोड़ करने के लिए कैसे चाहते हैं, लेकिन केवल कुछ स्तंभों में मैं में दिलचस्पी है।न आना एनए

उदाहरण के लिए,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

लेकिन मैं केवल इसलिए परिणाम होना चाहिए

x y z 
1 1 0 NA 
2 2 10 33 

na.omit लगता है सभी पंक्तियां नहीं हटा डेटा जहां yNA है छोड़ करना चाहते हैं, चोर किसी भी NA tain।

क्या कोई मुझे इस साधारण प्रश्न से बाहर करने में मदद कर सकता है?

लेकिन मैं जैसे प्रश्नों को बदलने अब यदि:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA)) 

मैं केवल x=na या z=na, जहां मैं समारोह में | डाल सकते हैं छोड़ करना चाहते हैं?

उत्तर

44

आप complete.cases समारोह का उपयोग करें और एक समारोह में यह thusly डाल सकता है:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

completeFun <- function(data, desiredCols) { 
    completeVec <- complete.cases(data[, desiredCols]) 
    return(data[completeVec, ]) 
} 

completeFun(DF, "y") 
# x y z 
# 1 1 0 NA 
# 2 2 10 33 

completeFun(DF, c("y", "z")) 
# x y z 
# 2 2 10 33 

संपादित करें:केवल के साथ पंक्तियों को वापस नहीं NA रों

आप कम से कम एक NA किसी भी स्तंभ में साथ सभी पंक्तियों को खत्म करने के लिए, बस complete.cases समारोह सीधे ऊपर का उपयोग करना चाहते हैं:

DF[complete.cases(DF), ] 
# x y z 
# 2 2 10 33 

या अगर completeFun पहले से ही में जमा हुआ है अपने कार्यप्रवाह;)

completeFun(DF, names(DF)) 
+0

क्या आप अपना दृष्टिकोण लालची बना सकते हैं? उन सभी कॉलम को लें जिनके पास एनएएस नहीं है। –

+1

आप का मतलब है * पंक्तियां * वापस 'एनए' के ​​साथ? 'पूर्णफन (डीएफ, नाम (डीएफ)) की तरह'? – BenBarnes

+0

सही! कृपया, इसे अपने उत्तर में जोड़ने पर विचार करें क्योंकि यह यहां एक आम आवश्यकता है। - मुझे लगता है कि मनेल का जवाब आपके रूप में विस्तारित नहीं किया जा सकता है। आपका कार्य दृष्टिकोण बहुत अच्छा है! –

133

उपयोग is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
DF[!is.na(DF$y),] 
+0

कैसे आप इस दृष्टिकोण लालच से सभी स्तंभों पर डेटा सेट में लागू होते हैं मिल गया? यदि कॉलम मान में से कोई एनए छोड़ना है। तो आपका डेटा सेट आउटपुट केवल दूसरा कॉलम है। –

3

इस प्रयास करें:

cc=is.na(DF$y) 
m=which(cc==c("TRUE")) 
DF=DF[-m,] 
20

प्रयोग करें 'सबसेट'

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
subset(DF, !is.na(y)) 
19

हैडली के tidyr सिर्फ इस अद्भुत समारोह drop_na

library(tidyr) 
DF %>% drop_na(y) 
    x y z 
1 1 0 NA 
2 2 10 33 
संबंधित मुद्दे