Data.frame में गुम मानों की रिपोर्ट करने का सुरुचिपूर्ण तरीका


81

यहाँ कोड का एक छोटा सा टुकड़ा है जो मैंने डेटा फ्रेम से लापता मूल्यों के साथ चर की रिपोर्ट करने के लिए लिखा था। मैं इसे करने के लिए और अधिक सुंदर तरीके से सोचने की कोशिश कर रहा हूं, एक जो शायद एक data.frame लौटाता है, लेकिन मैं फंस गया हूं:

for (Var in names(airquality)) {
    missing <- sum(is.na(airquality[,Var]))
    if (missing > 0) {
        print(c(Var,missing))
    }
}

संपादित करें: मैं दर्जनों से सैकड़ों चरों के साथ डेटा.फ्रेम के साथ काम कर रहा हूं, इसलिए यह महत्वपूर्ण है कि हम केवल गुम मानों के साथ चर की रिपोर्ट करें।


@kohske: यह मेरा पहला विचार था, लेकिन परिणाम tableवर्णों के हैं और आपको NAs की संख्या को पार करना होगा।
जोशुआ उलरिच

जब से आपने उत्तर पोस्ट किया है, मैं आपके सवाल का जवाब दे रहा हूं। यदि आप किसी उत्तर पर टिप्पणी करना चाहते हैं, तो कृपया उस उत्तर पर टिप्पणी के रूप में करें। यदि प्रश्नों में उत्तर भी होते हैं, तो यह बहुत भ्रमित हो जाता है।
एंड्री 29'11

@Andrie: मैं आपके संपादन से असहमत हूं, एक प्रमुख समस्या के रूप में जो मैं सामना कर रहा हूं वह केवल लापता मूल्यों के साथ चर की रिपोर्ट कर रही है। इसके अलावा, आपके रोलबैक ने मेरे द्वारा कोड में किए गए एक परिवर्तन को हटा दिया। मैंने इस जानकारी को शामिल करने के लिए अपने प्रश्न को संपादित किया है, और जोश के कोड के अपने संशोधित संस्करण को एक टिप्पणी में जोड़ा है।
ज़ैच

@Zach आपका नया संपादन मुझे ठीक लग रहा है। यदि यह लाइव इस प्रश्न को स्पष्ट करता है, तो एक बार लाइव होने पर मैं अतिरिक्त डेटा / रिक्वेस्ट को जोड़ने के लिए बाध्य नहीं हूं।
एंड्री

ऐसा करने के लिए आधे मिलियन तरीके हैं, CRAN Task View देखें - MissingData
zx8754

जवाबों:


157

महज प्रयोग करें sapply

> sapply(airquality, function(x) sum(is.na(x)))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0

आप द्वारा निर्मित मैट्रिक्स पर भी applyया उपयोग कर सकते हैंcolSumsis.na()

> apply(is.na(airquality),2,sum)
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0
> colSums(is.na(airquality))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0 

12
मैंने आपके कोड को थोड़ा संशोधित किया, केवल गुम मूल्य की रिपोर्ट करने के लिए:M <- sapply(airquality, function(x) sum(is.na(x))); M[M>0]
Zach

धन्यवाद! बहुत कुछ सीखा।
बॉम्बेक्स मोरी

हाय @ जोशुआ उलरिच, आपके रसीले कोड के लिए बहुत बहुत धन्यवाद। मैं डेटा फ़्रेम में एक कॉलम जोड़ना चाहूंगा जो ना मानों का प्रतिशत दिखाएगा। क्या आप कृपया इसके संबंध में कुछ सहायता प्रदान कर सकते हैं?
ड्यूकओवर

2
@Zach मैं आपके सुझाव के एक संस्करण का उपयोग करता हूं कि जाँच के लिए आवश्यक फ़ील्ड का एक मूल्य है:M <- colSums(is.na(airquality)); M[M <= 0]
एंथनी साइमन मिलेनिकज़ुक

@ जोशुआ% s के लिए एक विकल्प जोड़ने के लिए भी इक्का होगा!
राडेक

8

हम map_dfpurrr के साथ उपयोग कर सकते हैं ।

library(mice)
library(purrr)

# map_df with purrr
map_df(airquality, function(x) sum(is.na(x)))
# A tibble: 1 × 6
# Ozone Solar.R  Wind  Temp Month   Day
# <int>   <int> <int> <int> <int> <int>
# 1    37       7     0     0     0     0

1
map_dfओवर का क्या फायदा sapply?
Zach

1
@ मुझे लगता है कि कोई बड़ा अंतर नहीं है, लेकिन हैडली ने कहा कि किसी फ़ंक्शन के अंदर नीलम () का उपयोग न करें। अपवाद और डिबगिंग · उन्नत आर देखें adv-r.had.co.nz/Exceptions-Debugging.html
कीकू

मेरे जैसे आलसी लोगों के लिए, आप उपरोक्त कोड को कार्यों के लिए छोटे purrr सिंटैक्स में लिख सकते हैं (~) तो यह इस तरह दिखता है:map_df( air quality, ~sum(is.na(.) )
Agile Bean

1
@Zach का लाभ map_dfअधिक sapplyकेवल जब परिणाम पंक्तियां हैं map_df के उत्पादन में प्रारूप हमेशा एक Tibble है के रूप में है।
एजिल बीन

1
@Zach: vapplyबनाम sapplyकार्यों में इसका उपयोग करना बेहतर है क्योंकि vapplyआपको एक ज्ञात परिणाम संरचना मिलती है (जो आप निर्दिष्ट करते हैं)। sapplyफ़ंक्शन आउटपुट के आधार पर एक सरणी या सूची वापस कर सकते हैं। इसका एक नुकसान map_dfयह है कि आप इसे इनपुट के रूप में एक डेटा.फ़्रेम देते हैं, और यह एक डेटा.फ़्रेम उपक्लास देता है, न कि डेटा.फ़्रेम। इस बात की कोई गारंटी नहीं है कि tibbles भविष्य में सभी आवश्यक मामलों में data.frames के रूप में व्यवहार करेंगे।
जोशुआ उलरिच

8

मेरा नया पसंदीदा (बहुत विस्तृत नहीं) डेटा उत्कृष्ट नानीर पैकेज के तरीके हैं । न केवल आप आवृत्तियों प्राप्त करते हैं, बल्कि लापता होने के पैटर्न भी:

library(naniar)
library(UpSetR)

riskfactors %>%
  as_shadow_upset() %>%
  upset()

यहाँ छवि विवरण दर्ज करें

यह अक्सर देखने के लिए उपयोगी है कि मिसिंग न होने के संबंध में कहां हैं जो मिसिंग के साथ बिखराव की साजिश रचने से प्राप्त की जा सकती हैं:

ggplot(airquality,
       aes(x = Ozone,
           y = Solar.R)) +
 geom_miss_point()

यहाँ छवि विवरण दर्ज करें

या श्रेणीबद्ध चर के लिए:

gg_miss_fct(x = riskfactors, fct = marital)

यहाँ छवि विवरण दर्ज करें

ये उदाहरण पैकेज विगनेट से हैं जो अन्य दिलचस्प दृश्यों को सूचीबद्ध करते हैं।


2
इसे पोस्ट करने के लिए धन्यवाद! gg_miss_upset()नवीनतम रिलीज में अब एक समर्पित कार्य है, जो छुट्टी से लौटने के बाद सीआरएएन को प्रस्तुत किया जाएगा। naniar.njtierney.com/reference/gg_miss_upset.html
निक

6
summary(airquality)

यह जानकारी आपको पहले ही दे देता है

विम पैकेज भी कुछ data.frame के लिए डेटा साजिश लापता अच्छा प्रदान करता है

library("VIM")
aggr(airquality)

यहाँ छवि विवरण दर्ज करें


क्या VIM पैकेज रिपोर्ट कर सकता है कि किन विशिष्ट टिप्पणियों में डेटा गायब है?
एंथनी साइमन मिलेनिकज़ुक

ऐसा मत सोचो .. लेकिन आप इसे काफी आसानी से प्राप्त कर सकते हैं (आपको अपने स्वयं के डेटाफ्रेम के साथ हवाईजहाज को बदलना होगा): Res <- airquality [rowSums (is.na (airquality))> 0,]
स्टीफन

4

अधिक रसीला: sum(is.na(x[1]))

अर्थात्

  1. x[1] पहले कॉलम को देखें

  2. is.na() सच है अगर यह है NA

  3. sum() TRUEहै 1, FALSEहै0


यह मूल प्रश्न का उत्तर नहीं देता है, जो डेटा में सभी स्तंभों के NAलिए s की संख्या का पता लगाने के लिए है
बेन बोल्कर

4

एक और चित्रमय विकल्प - plot_missingउत्कृष्ट DataExplorerपैकेज से कार्य :

यहाँ छवि विवरण दर्ज करें

डॉक्स इस तथ्य को भी इंगित करता है कि आप अतिरिक्त विश्लेषण के लिए इस परिणाम को बचा सकते हैं missing_data <- plot_missing(data)


plot_missing()में समारोह DataExplorerपैकेज अब है PlotMissing()
कोप

1
@coip PlotMissing()को हटा दिया गया है। कृपया plot_missing()इसके बजाय उपयोग करें । देखें # 49 अधिक जानकारी के लिए।
बॉक्सुआन

2

एक अन्य फ़ंक्शन जो आपको लापता डेटा को देखने में मदद करेगा, funModeling लाइब्रेरी से df_status होगा

library(funModeling)

iris.2 कुछ जोड़े गए NAs. के साथ आईरिस डेटासेट है। आप इसे अपने डेटासेट से बदल सकते हैं।

df_status(iris.2)

यह आपको प्रत्येक कॉलम में NA की संख्या और प्रतिशत देगा।


1

एक और चित्रमय समाधान के लिए, visdat पैकेज प्रदान करता है vis_miss

library(visdat)
vis_miss(airquality)

यहाँ छवि विवरण दर्ज करें

Ameliaबॉक्स से बाहर मिसिंग पर% s देने के एक छोटे अंतर के साथ आउटपुट के समान ।


1

मुझे लगता है कि लापता डेटा को संभालने के लिए अमेलिया लाइब्रेरी अच्छा काम करती है, इसमें लापता पंक्तियों को देखने के लिए एक मानचित्र भी शामिल है।

install.packages("Amelia")
library(Amelia)
missmap(airquality)

यहाँ छवि विवरण दर्ज करें

आप निम्न कोड भी चला सकते हैं ना के तर्क मान लौटाएंगे

row.has.na <- apply(training, 1, function(x){any(is.na(x))})

1

लाइब्रेरी is.na10से फ़ंक्शन का उपयोग करने के लिए एक और चित्रमय और इंटरैक्टिव तरीका है heatmaply:

library(heatmaply)

heatmaply(is.na10(airquality), grid_gap = 1, 
          showticklabels = c(T,F),
            k_col =3, k_row = 3,
            margins = c(55, 30), 
            colors = c("grey80", "grey20"))

यहाँ छवि विवरण दर्ज करें

शायद बड़े डेटासेट के साथ अच्छा काम नहीं करेगा ..


0

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

length(which(is.na(airquality[1])==T))

4
आपको तार्किक वेक्टर की तुलना T से करने की आवश्यकता नहीं है। आप तार्किक वेक्टर में TRUE तत्वों की संख्या की गणना कर सकते हैं।
गृहलक्ष्मी


0

dplyrगणना करने के लिए एक समाधान हो सकता है:

summarise_all(df, ~sum(is.na(.)))

या प्रतिशत प्राप्त करने के लिए:

summarise_all(df, ~(sum(is_missing(.) / nrow(df))))

शायद यह भी ध्यान देने योग्य है कि लापता डेटा बदसूरत, असंगत हो सकता है, और हमेशा NAस्रोत के आधार पर कोडित नहीं किया जाता है या आयातित होने पर इसे कैसे संभाला जाता है। आपके डेटा के आधार पर निम्नलिखित फ़ंक्शन को ट्वीक किया जा सकता है और आप लापता पर विचार करना चाहते हैं:

is_missing <- function(x){
  missing_strs <- c('', 'null', 'na', 'nan', 'inf', '-inf', '-9', 'unknown', 'missing')
  ifelse((is.na(x) | is.nan(x) | is.infinite(x)), TRUE,
         ifelse(trimws(tolower(x)) %in% missing_strs, TRUE, FALSE))
}

# sample ugly data
df <- data.frame(a = c(NA, '1', '  ', 'missing'),
                 b = c(0, 2, NaN, 4),
                 c = c('NA', 'b', '-9', 'null'),
                 d = 1:4,
                 e = c(1, Inf, -Inf, 0))

# counts:
> summarise_all(df, ~sum(is_missing(.)))
  a b c d e
1 3 1 3 0 2

# percentage:
> summarise_all(df, ~(sum(is_missing(.) / nrow(df))))
     a    b    c d   e
1 0.75 0.25 0.75 0 0.5
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.