एक कॉलम में NA मानों की संख्या निर्धारित करें


142

मैं NAडेटा फ़्रेम कॉलम में मानों की संख्या गिनना चाहता हूं । कहते हैं कि मेरा डेटा फ्रेम कहा जाता है df, और मैं जिस कॉलम पर विचार कर रहा हूं उसका नाम है col। मैं जिस तरह से आया हूं वह निम्नलिखित है:

sapply(df$col, function(x) sum(length(which(is.na(x)))))  

क्या ऐसा करने का यह एक अच्छा / सबसे कारगर तरीका है?

जवाबों:


316

आप समस्या पर विचार कर रहे हैं:

sum(is.na(df$col))

इसके लिए शुक्रिया। इसे थोड़ा विस्तार देने के लिए। मनमानी मात्रा में value, के अलावा अन्य NAएक बूलियन फ़ंक्शन लिख रहा है is.valueऔर फिर sum(is.value(df$col))जाने के तरीके का उपयोग कर रहा है या क्या इसके लिए अधिक संक्षिप्त प्रत्यक्ष वाक्यविन्यास है?
user3274289

3
पूछने की जल्दी थी। sum(df$col==value,na.rm=FALSE)उसने चाल चली।
user3274289

4
@ user3274289: हालांकि आप आमतौर पर चाहते हैं na.rm=TRUE, क्योंकि अन्यथा यदि df$colNAs शामिल हैं, sumतो वापस आ जाएगा NA
2

1
कभी-कभी मुझे लगता है कि मैं बहुत सोच-विचार कर रहा हूं, जब तक मुझे यह जवाब नहीं मिला ... ठीक है, यह सच है ...
रुगेल

क्षमा करें, लेकिन यह मेरे लिए काम नहीं करता है। मुझे यह चेतावनी मिलती है चेतावनी संदेश: In.na (nom $ wd): is.na () प्रकार 'NULL' के गैर- (सूची या वेक्टर) पर लागू होता है, और गिनती सिर्फ शून्य होती है।
हरमन टूथ्रोट

77

यदि आप NAकिसी डेटाफ़्रेम में प्रत्येक स्तंभ के लिए मायने रखते हैं तो:

na_count <-sapply(x, function(y) sum(length(which(is.na(y)))))

आपको प्रत्येक कॉलम के लिए मायने रखता है।

na_count <- data.frame(na_count)

एक डेटाफ़्रेम में अच्छी तरह से डेटा का उत्पादन करना चाहिए:

----------------------
| row.names | na_count
------------------------
| column_1  | count

1
एक स्तंभ के रूप में पंक्ति नामों को शामिल करने के लिए, भी चलाएं na_count$name<-rownames(na_count)
मैट

6
na_count <-sapply(x, function(y) sum(is.na(y)))एक छोटा विकल्प है।
विंसेंट बोनहोमे

1
मेरे लिए काम नहीं किया :( इसे बदलना पड़ा: na_count <- लागू करें (x, फ़ंक्शन (y) योग (is.na (y)), MARGIN = 2)
एंजेल गार्सिया कैम्पोस

मुझे नहीं लगता कि हमें योग और लंबाई फ़ंक्शन (पहले na_count असाइनमेंट में) दोनों का उपयोग करने की आवश्यकता है? बस लंबाई पर्याप्त होनी चाहिए।
यैंडल


18

यदि आप संपूर्ण डेटाफ़्रेम में NA की संख्या गिनना चाह रहे हैं तो आप भी उपयोग कर सकते हैं

sum(is.na(df))

13

में summary()उत्पादन, समारोह भी मायने रखता NAहै कि अगर एक का योग चाहता है तो एक इस सुविधा का उपयोग कर सकते हैं NAकई चर में।


2
वर्थ नोटिंग कि summaryजब किसी एकल स्तंभ पर उपयोग किया जाता है तो आउटपुट प्रयोग करने योग्य होता है, जबकि संपूर्ण डेटा फ़्रेम से इसका आउटपुट वर्ण होता है और यदि आपको बाद में इनकी आवश्यकता होती है, तो इसे निकालना मुश्किल होता है। देख लो c(summary(mtcars))
रिच स्क्रिप्‍ट

9

डेटाफ़्रेम के प्रत्येक कॉलम में नल की संख्या को गिनने का एक सुव्यवस्थित तरीका:

library(tidyverse)
library(purrr)

df %>%
    map_df(function(x) sum(is.na(x))) %>%
    gather(feature, num_nulls) %>%
    print(n = 100)

3
आपको purrr की भी आवश्यकता नहीं है:df %>% summarise_all(funs(sum(is.na(.))))
डेविड ब्रूस बोरेंस्टीन

: तुम मुझे पसंद आलसी हैं, तो आप के रूप में कुछ कम purrr वाक्य रचना में @Abi कश्मीर के जवाब में एक ही लिख सकते हैं df %>% map_df(~sum(is.na(.)))या dplyr बिना के रूप मेंmap_df(~sum(is.na(df)))
चंचल बीन

7

यह रूप, केविन ओगोरोस के एक से थोड़ा बदला गया:

na_count <-function (x) sapply(x, function(y) sum(is.na(y)))

एनए रिटर्न को इंट सरणी के रूप में गिना जाता है


सूची के रूप में परिणाम पाने के लिए:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

6

NAसभी स्तंभों के लिए एक गिनती प्राप्त करने के लिए एक त्वरित और आसान Tidyverse समाधान का उपयोग करना है summarise_all()जो मुझे लगता है कि उपयोग करने की तुलना में समाधान को पढ़ने के लिए बहुत आसान बनाता है purrrयाsapply

library(tidyverse)
# Example data
df <- tibble(col1 = c(1, 2, 3, NA), 
             col2 = c(NA, NA, "a", "b"))

df %>% summarise_all(~ sum(is.na(.)))
#> # A tibble: 1 x 2
#>    col1  col2
#>   <int> <int>
#> 1     1     2


3

उपयोगकर्ता rrs का उत्तर सही है लेकिन यह केवल आपको डेटा फ्रेम के विशेष कॉलम में NA मानों की संख्या बताता है जिसे आप पूरे डेटा फ्रेम के लिए NA मानों की संख्या प्राप्त करने के लिए पास कर रहे हैं:

apply(<name of dataFrame>, 2<for getting column stats>, function(x) {sum(is.na(x))})

यह ट्रिक करता है


कुछ कोड हैं जो इस कोड को गैर-कार्यात्मक बनाते हैं। इसे इस्तेमाल करे; apply(df, 2, function(x) sum(is.na(x)))
user3495945

3

मैंने स्थानीय निर्देशिका से एक सीएसवी फ़ाइल पढ़ी । निम्नलिखित कोड मेरे लिए काम करता है।

# to get number of which contains na
sum(is.na(df[, c(columnName)]) # to get number of na row

# to get number of which not contains na
sum(!is.na(df[, c(columnName)]) 

#here columnName is your desire column name

2

Hute37 के उत्तर के समान लेकिन purrrपैकेज का उपयोग करना । मुझे लगता है कि यह स्पष्ट दृष्टिकोण अबीके द्वारा प्रस्तावित उत्तर की तुलना में सरल है।

library(purrr)
map_dbl(df, ~sum(is.na(.)))

नोट: टिल्ड ( ~) एक अनाम फ़ंक्शन बनाता है। और यह '।' अनाम फ़ंक्शन के लिए इनपुट को संदर्भित करता है, इस मामले में data.frame df


0

आप इसका उपयोग प्रत्येक कॉलम में NA या ब्लैंक की संख्या गिनने के लिए कर सकते हैं

colSums(is.na(data_set_name)|data_set_name == '')

0
sapply(name of the data, function(x) sum(is.na(x)))

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