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?

user3274289
quelle

Antworten:

314

Sie überdenken das Problem:

sum(is.na(df$col))
rrs
quelle
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
Kevin Ogoro
quelle
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 
Tony Ladson
quelle
18

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

sum(is.na(df))
bkielstr
quelle
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 .

Shahin
quelle
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)
Abi K.
quelle
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

hute37
quelle
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
Moohan
quelle
3

Versuche dies:

length(df$col[is.na(df$col)])
Rabish Kumar Singh
quelle
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

iec2011007
quelle
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
reza.cse08
quelle
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.

Chris Kiniry
quelle
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 == '')
Prakhar Srivastava
quelle
0
sapply(name of the data, function(x) sum(is.na(x)))
UTKARSH
quelle
Siehe " Erklären vollständig codebasierter Antworten ". Dies mag zwar technisch korrekt sein, erklärt jedoch nicht, warum es das Problem löst oder die ausgewählte Antwort sein sollte. Wir sollten zusätzlich aufklären, um das Problem zu lösen.
Der Blechmann