Bestimmen Sie die Anzahl der NA-Werte in einer Spalte


142

Ich möchte die Anzahl der NAWerte in einer Datenrahmenspalte zählen. Angenommen, mein Datenrahmen wird aufgerufen df, und der Name der Spalte, die ich in Betracht ziehe, lautet col. Ich habe mir Folgendes ausgedacht:

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

Ist dies ein guter / effizientester Weg, dies zu tun?

Antworten:


314

Sie überdenken das Problem:

sum(is.na(df$col))

Danke dafür. Um dies ein wenig zu erweitern. Wenn Sie eine beliebige Menge zählen value, außer NAeine boolesche Funktion zu schreiben is.valueund dann den richtigen sum(is.value(df$col))Weg zu gehen, oder gibt es dafür eine präzisere direkte Syntax?
user3274289

3
War zu schnell zu fragen. sum(df$col==value,na.rm=FALSE)macht den Trick.
user3274289

4
@ user3274289: obwohl Sie normalerweise möchten na.rm=TRUE, weil sonst, wenn df$colNAs enthält, sumzurückkehren NA.
Jbaums

1
Manchmal denke ich, ich überdenke, bis ich diese Antwort
bekomme

Entschuldigung, aber das funktioniert bei mir nicht. Ich erhalte diese Warnmeldung: In is.na (nom $ wd): is.na () wird auf Nicht- (Liste oder Vektor) vom Typ 'NULL' angewendet, und die Anzahl ist nur Null.
Herman Toothrot

77

Wenn Sie nach NAZählungen für jede Spalte in einem Datenrahmen suchen, dann:

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

sollte Ihnen eine Liste mit den Zählungen für jede Spalte geben.

na_count <- data.frame(na_count)

Sollte die Daten gut in einem Datenrahmen ausgeben wie:

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

1
Führen Sie auch aus, um die Zeilennamen als Spalte einzuschließen na_count$name<-rownames(na_count).
Matt

6
na_count <-sapply(x, function(y) sum(is.na(y)))ist eine kürzere Alternative.
Vincent Bonhomme

1
Hat bei mir nicht funktioniert :( Musste es ändern in: na_count <- anwenden (x, Funktion (y) Summe (is.na (y)), MARGIN = 2)
Angel Garcia Campos

Ich denke nicht, dass wir sowohl die Summen- als auch die Längenfunktion verwenden müssen (in der ersten na_count-Zuweisung)? Nur die Länge sollte ausreichen.
Yandle

39

Probieren Sie die colSumsFunktion aus

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

colSums(is.na(df))

#x y 
#1 3 

18

Wenn Sie die Anzahl der NAs im gesamten Datenrahmen zählen möchten, können Sie diese auch verwenden

sum(is.na(df))

13

In der summary()Ausgabe zählt die Funktion auch das NAs, so dass man diese Funktion verwenden kann, wenn man die Summe von NAs in mehreren Variablen haben möchte .


2
Es ist erwähnenswert, dass die summaryAusgabe, wenn sie für eine einzelne Spalte verwendet wird, verwendbar ist, während die Ausgabe von einem gesamten Datenrahmen Zeichen ist und die Anzahl schwierig zu extrahieren ist, wenn Sie sie später benötigen. Siehe c(summary(mtcars)).
Rich Scriven

9

Eine einfache Methode, um die Anzahl der Nullen in jeder Spalte eines Datenrahmens zu zählen:

library(tidyverse)
library(purrr)

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

3
Sie brauchen nicht einmal Schnurren:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein

Wenn Sie faul sind wie ich, können Sie das gleiche in @Abi Ks Antwort in der etwas kürzeren Purrr-Syntax schreiben als: df %>% map_df(~sum(is.na(.)))oder ohne dplyr asmap_df(~sum(is.na(df)))
Agile Bean

7

Diese Form, leicht geändert von Kevin Ogoros:

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

Gibt NA-Zählungen als benanntes int-Array zurück


um Ergebnis als Liste zu erhalten:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

6

Eine schnelle und einfache Tidyverse-Lösung, um eine NAZählung für alle Spalten zu erhalten, ist die Verwendung, summarise_all()die meiner Meinung nach eine viel einfacher zu lesende Lösung darstellt als die Verwendung von purrrodersapply

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

Die Antwort des Benutzers ist richtig, aber das sagt Ihnen nur die Anzahl der NA-Werte in der bestimmten Spalte des Datenrahmens, die Sie übergeben, um die Anzahl der NA-Werte für den gesamten Datenrahmen zu erhalten. Versuchen Sie Folgendes:

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

Das macht den Trick


Es gibt einige Tippfehler, die diesen Code funktionsunfähig machen. Versuche dies; apply(df, 2, function(x) sum(is.na(x)))
user3495945

3

Ich habe eine CSV- Datei aus dem lokalen Verzeichnis gelesen . Der folgende Code funktioniert bei mir.

# 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

Ähnlich wie die Antwort von hute37, aber mit dem purrrPaket. Ich denke, dieser tidyverse Ansatz ist einfacher als die von AbiK vorgeschlagene Antwort.

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

Hinweis: Die Tilde ( ~) erstellt eine anonyme Funktion. Und das '.' bezieht sich auf die Eingabe für die anonyme Funktion, in diesem Fall den data.frame df.


0

Sie können dies verwenden, um die Anzahl der NA oder Leerzeichen in jeder Spalte zu zählen

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.