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ć?

Odpowiedzi:


316

Zastanawiasz się nad problemem:

sum(is.na(df$col))

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

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 

18

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

sum(is.na(df))

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.


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)

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


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


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ę


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

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.


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 == '')

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.