डेटा फ़्रेम के चुने हुए कॉलम में NA (गायब) मान वाली पंक्तियों की सबसेट


96

हमारे पास CSV फ़ाइल से डेटा फ़्रेम है। डेटा फ़्रेम में DFऐसे स्तंभ होते हैं जिनमें देखे गए मान होते हैं और एक स्तंभ ( VaR2) जिसमें वह तिथि होती है जिस पर माप लिया जाता है। यदि दिनांक दर्ज नहीं की गई थी, तो NAगुम डेटा के लिए CSV फ़ाइल में मान होता है ।

Var1  Var2 
10   2010/01/01
20   NA
30   2010/03/01

हम एक नए डेटा फ्रेम को परिभाषित करने के लिए सबसेट कमांड का उपयोग करना चाहते हैं, new_DFजैसे कि इसमें केवल पंक्तियाँ होती हैं जिनका NA'कॉलम ( VaR2) से मान होता है । दिए गए उदाहरण में, केवल रो 2 नए में समाहित होगा DF

आदेश

new_DF<-subset(DF,DF$Var2=="NA") 

काम नहीं करता है, जिसके परिणामस्वरूप डेटा फ़्रेम में कोई पंक्ति प्रविष्टियां नहीं हैं।

यदि मूल CSV फ़ाइल में मान NAका आदान-प्रदान किया जाता है NULL, तो वही कमांड वांछित परिणाम उत्पन्न करता है new_DF<-subset(DF,DF$Var2=="NULL"):।

मैं इस पद्धति को कैसे काम कर सकता हूं, यदि चरित्र स्ट्रिंग के NAलिए मूल सीएसवी फ़ाइल में मूल्य प्रदान किया गया है?

जवाबों:


146

लापता मूल्यों के परीक्षण के लिए कभी भी == 'NA' का उपयोग न करें। is.na()इसके बजाय उपयोग करें । यह करना चाहिए:

new_DF <- DF[rowSums(is.na(DF)) > 0,]

या यदि आप किसी विशेष कॉलम की जाँच करना चाहते हैं, तो आप इसका उपयोग भी कर सकते हैं

new_DF <- DF[is.na(DF$Var),]

यदि आपके पास NA वर्ण मान हैं, तो पहले चलाएं

Df[Df=='NA'] <- NA

लापता मूल्यों के साथ उन्हें बदलने के लिए।


2
आपके तेज़ उत्तर के लिए धन्यवाद (यह त्वरित था)! दरअसल, डेटा के सीएसवी-डिलीवरी के कारण, 'एनए' चरित्र मान हैं और आपका दूसरा विवरण बहुत उपयोगी हो सकता है। क्या आप अपने पहले कथन को भी स्पष्ट कर सकते हैं? मेरे लिए रोम्सम्स () का उपयोग स्पष्ट नहीं है, क्योंकि मैं केवल एक विशेष कॉलम की जांच करूंगा (बहुत सारे कॉलम हैं)। यदि वह विशेष कॉलम (उदाहरण में यह कॉलम वर 2 होगा) में एक 'एनए' वर्ण स्ट्रिंग है (मैं इसे आपके दूसरे विवरण के साथ बदल दूंगा), तो मैं नए डेटा फ्रेम का हिस्सा बनने के लिए पूरी पंक्ति चुनना चाहूंगा ।
जॉन

@ जॉन: अपडेट किया गया। इस बिंदु का उपयोग करना है। इसलिए, मैंने गलत तरीके से व्याख्या की कि आप सभी चर की जांच करना चाहते हैं।
जोरिस मेव्स 21

3
ऐसा होना चाहिए new_DF <- DF[is.na(DF$Var),], यानी (बाद में एक अतिरिक्त ब्रैकेट प्रतीत होता है DF[?
पैट्रिक टीटी

39

एनए आर में एक विशेष मूल्य है, एनए मूल्य को "एनए" स्ट्रिंग के साथ न मिलाएं। डेटा आयात किए जाने के तरीके के आधार पर, आपके "NA" और "NULL" सेल विभिन्न प्रकार के हो सकते हैं (डिफ़ॉल्ट व्यवहार "NA" स्ट्रिंग्स को NA मानों में बदलने के लिए है, और "NULL" स्ट्रिंग्स को जैसा है)।

यदि read.table () या read.csv () का उपयोग कर रहे हैं, तो आपको स्वच्छ डेटा आयात करने के लिए "na.strings" तर्क पर विचार करना चाहिए, और हमेशा वास्तविक R NA मान के साथ काम करना चाहिए।

एक उदाहरण, "NULL" और "NA" सेल दोनों मामलों में काम करना:

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))

1
आपके उत्तर के लिए धन्यवाद। अगर मैं इसे सही ढंग से समझ लूं तो पहला कथन Df [Df == 'NA'] <- NA जैसे ही होगा जोरी के उदाहरण में? तब (छोटा) अंतर यह होगा कि यह शुरुआत में आपकी विधिवत तरीके से किया जाता है, जब डेटा फ्रेम बनाया जाता है (यह एक बहुत ही साफ प्रोग्रामिंग विधि है और मुझे यह पसंद है)।
जॉन

बिल्कुल सही। जोरिस ने एनए मानों द्वारा "एनए" तार को मैन्युअल रूप से बदलने का सुझाव दिया, यहां मैं केवल एक ही उद्देश्य को प्राप्त करने के लिए read.table () की "na.strings" सुविधा का उपयोग करने का सुझाव देता हूं।
maressyl

जोरिस का जवाब वास्तव में इस उपलब्धि को पूरा करने का "पसंदीदा" तरीका है (यदि आप इसे स्क्रिप्ट में लिख रहे हैं)। देखें: stackoverflow.com/questions/9860090/…
जोनाथन

@ जोनाथन: यहां दो अलग-अलग विचार, जो विषय आप उद्धृत करते हैं, "[" को "सबसेट" पर वरीयता दी जानी चाहिए, लेकिन हम read.table () में "na.strings" तर्क के बारे में बात कर रहे थे, मेरा उपसमुच्चय केवल कल्पना करने के लिए यहां था असर।
मार्सिले

33

complete.casesदेता है TRUEजब एक पंक्ति में सभी मान नहीं हैंNA

DF[!complete.cases(DF), ]

12
new_data <- data %>% filter_all(any_vars(is.na(.))) 

इसमें एक नया डेटा फ्रेम ( new_data) बनाया जाना चाहिए, जिसमें केवल लापता मान हों।

उन मूल्यों का ट्रैक रखने के लिए सबसे अच्छा काम करता है जिन्हें आप बाद में छोड़ सकते हैं क्योंकि उनके पास लापता टिप्पणियों (एनए) के साथ कुछ कॉलम थे।


3

इसे बदलने का प्रयास करें:

new_DF<-dplyr::filter(DF,is.na(Var2)) 

क्या आप बता सकते हैं कि यह क्यों काम करता है, यह क्या करता है आदि?
csilk

new_DF <-dplyr :: फिल्टर (डीएफ, is.na (var2)) यह मूल रूप से var2 स्तंभ जो हालत को संतुष्ट में किसी भी अवलोकन बाहर dplyr पैकेज और फिल्टर के फिल्टर समारोह का उपयोग यानी is.na वे सब एनए के साथ अवलोकन लेने
drhnis

1
अधिक अच्छी तरह के DF %>% filter(is.na(Var2))बाद के रूप में व्यक्त किया library(dplyr)
जो

-1

एनए डेटा के साथ सभी पंक्तियों को प्रिंट करता है:

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]

@ZheyuanLi यदि आपको उत्तर पसंद नहीं है, तो बस इसे डाउन-वोट करें। फ़्लैगिंग की अनुशंसा करने के लिए उत्तर का संपादन करना उचित नहीं है। अगर आपको जरूरत महसूस हो तो एक टिप्पणी छोड़ दें।
मैनफ्रेड रैडलीमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.