Określ liczbę wartości NA w kolumnie

142

Chcę policzyć liczbę NAwartości w kolumnie ramki danych. Powiedzmy, że nazywa się moja ramka danych df, a nazwa kolumny, którą rozważam, to col. Sposób, który wymyśliłem, jest następujący:

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

Czy to dobry / najbardziej efektywny sposób, aby to zrobić?

user3274289
źródło

Odpowiedzi:

316

Zastanawiasz się nad problemem:

sum(is.na(df$col))
rrs
źródło
Dziękuję Ci za to. Aby to trochę rozwinąć. Zliczając dowolną ilość value, inną niż NAzapisywanie funkcji boolowskiej, is.valuea następnie używanie sum(is.value(df$col))sposobu, czy jest do tego bardziej zwięzła bezpośrednia składnia?
user3274289
3
Był zbyt szybki, by o to zapytać. sum(df$col==value,na.rm=FALSE)Zrób sztuczkę.
user3274289
4
@ user3274289: chociaż zazwyczaj będziesz chciał na.rm=TRUE, ponieważ w przeciwnym razie, jeśli df$colzawiera NA, sumzwróci NA.
jbaums
1
Czasami myślę, że się nad tym zastanawiam, dopóki nie otrzymam odpowiedzi ... cóż, to prawda ...
Rugal,
przepraszam, ale to nie działa dla mnie. Otrzymuję to ostrzeżenie Komunikat ostrzegawczy: W is.na (nom $ wd): is.na () zastosowano do elementu innego niż (lista lub wektor) typu „NULL”, a liczba wynosi tylko zero.
Herman Toothrot
77

Jeśli szukasz NAzliczeń dla każdej kolumny w ramce danych, to:

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

powinien dać ci listę z liczebnościami dla każdej kolumny.

na_count <- data.frame(na_count)

Powinien ładnie wyświetlać dane w ramce danych, takiej jak:

----------------------
| row.names | na_count
------------------------
| column_1  | count
Kevin Ogoro
źródło
1
Aby dołączyć nazwy wierszy jako kolumny, uruchom również na_count$name<-rownames(na_count).
Matt
6
na_count <-sapply(x, function(y) sum(is.na(y)))to krótsza alternatywa.
Vincent Bonhomme
1
Nie działa dla mnie :( Musiałem to zmienić na: na_count <- apply (x, function (y) sum (is.na (y)), MARGIN = 2)
Angel Garcia Campos
Myślę, że nie musimy używać zarówno funkcji sumy, jak i długości (w pierwszym przypisaniu na_count)? Sama długość powinna wystarczyć.
Yandle
39

Wypróbuj colSumsfunkcję

df <- data.frame(x = c(1,2,NA), y = rep(NA, 3))

colSums(is.na(df))

#x y 
#1 3 
Tony Ladson
źródło
18

Jeśli chcesz policzyć liczbę NA w całej ramce danych, możesz również użyć

sum(is.na(df))
bkielstr
źródło
13

Na summary()wyjściu funkcja liczy również NAs, więc można użyć tej funkcji, jeśli chce się sumę NAs w kilku zmiennych.

Shahin
źródło
2
Warto zauważyć, że dane summarywyjściowe używane w jednej kolumnie są użyteczne, podczas gdy ich wyjście z całej ramki danych jest znakowe, a liczby są trudne do wyodrębnienia, jeśli będą potrzebne później. Zobacz c(summary(mtcars)).
Rich Scriven
9

Prosty, zwrotny sposób zliczania wartości null w każdej kolumnie ramki danych:

library(tidyverse)
library(purrr)

df %>%
    map_df(function(x) sum(is.na(x))) %>%
    gather(feature, num_nulls) %>%
    print(n = 100)
Abi K.
źródło
3
Nie musisz nawet mruczeć:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein,
Jeśli jesteś leniwy jak ja, możesz napisać to samo w odpowiedzi @Abi K w nieco krótszej składni mruczenia, jak: df %>% map_df(~sum(is.na(.)))lub bez dplyr asmap_df(~sum(is.na(df)))
Agile Bean
7

Ta forma, nieco zmieniona od tej Kevina Ogorosa:

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

zwraca liczbę NA jako nazwaną tablicę int

hute37
źródło
aby otrzymać wynik w postaci listy:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37
6

Szybkim i łatwym rozwiązaniem Tidyverse, aby uzyskać NAliczbę wszystkich kolumn, jest użycie, summarise_all()które moim zdaniem jest znacznie łatwiejsze do odczytania niż użycie purrrlubsapply

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
Moohan
źródło
3

Spróbuj tego:

length(df$col[is.na(df$col)])
Rabish kumar Singh
źródło
3

Odpowiedź użytkownika rrs jest prawidłowa, ale to tylko mówi o liczbie wartości NA w określonej kolumnie ramki danych, którą przekazujesz, aby uzyskać liczbę wartości NA dla całej ramki danych, spróbuj tego:

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

To załatwia sprawę

iec2011007
źródło
Istnieje kilka literówek, które powodują, że ten kod nie działa. Spróbuj tego; apply(df, 2, function(x) sum(is.na(x)))
user3495945
3

Czytałem plik csv z katalogu lokalnego. Poniższy kod działa dla mnie.

# 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
reza.cse08
źródło
2

Podobna do odpowiedzi hute37, ale przy użyciu purrrpakietu. Myślę, że to uporządkowane podejście jest prostsze niż odpowiedź zaproponowana przez AbiK.

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

Uwaga: tylda ( ~) tworzy anonimową funkcję. A „.” odnosi się do wejścia dla funkcji anonimowej, w tym przypadku data.frame df.

Chris Kiniry
źródło
0

Możesz użyć tego do zliczenia liczby NA lub spacji w każdej kolumnie

colSums(is.na(data_set_name)|data_set_name == '')
Prakhar Srivastava
źródło
0
sapply(name of the data, function(x) sum(is.na(x)))
UTKARSH
źródło
Zobacz „ Wyjaśnianie odpowiedzi opartych wyłącznie na kodzie ”. Chociaż może to być technicznie poprawne, nie wyjaśnia, dlaczego rozwiązuje problem lub powinno być wybraną odpowiedzią. Powinniśmy dodatkowo kształcić, aby pomóc rozwiązać problem.
Tin Man