Determina il numero di valori NA in una colonna


143

Voglio contare il numero di NAvalori in una colonna di frame di dati. Supponiamo che venga chiamato il mio frame di dati dfe che il nome della colonna che sto prendendo in considerazione siacol . Il modo in cui mi è venuto in mente è il seguente:

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

È un modo buono / efficace per farlo?

Risposte:


316

Stai pensando troppo al problema:

sum(is.na(df$col))

Grazie per questo. Per espanderlo un po '. Nel contare la quantità di arbitrario value, oltre a NAscrivere una funzione booleana is.valuee quindi usare sum(is.value(df$col))la strada da percorrere o c'è una sintassi diretta più concisa per questo?
user3274289

3
È stato troppo veloce per chiedere. sum(df$col==value,na.rm=FALSE)fa il trucco.
user3274289

4
@ user3274289: anche se di solito vorrai na.rm=TRUE, perché altrimenti, se df$colcontiene NA, sumtornerà NA.
jbaums

1
A volte penso di pensare troppo, fino a quando non ho ricevuto questa risposta ... beh, è ​​vero ...
Rugal,

scusa ma questo non funziona per me. Ricevo questo avviso Messaggio di avviso: In is.na (nom $ wd): is.na () applicato a non (elenco o vettore) di tipo 'NULL' e il conteggio è solo zero.
Herman Toothrot,

77

Se stai cercando NAconteggi per ogni colonna in un frame di dati, allora:

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

dovrebbe darti un elenco con i conteggi per ogni colonna.

na_count <- data.frame(na_count)

Dovrebbe produrre correttamente i dati in un dataframe come:

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

1
Per includere i nomi delle righe come una colonna, eseguire anche na_count$name<-rownames(na_count).
Matt,

6
na_count <-sapply(x, function(y) sum(is.na(y)))è un'alternativa più breve.
Vincent Bonhomme,

1
Non ha funzionato per me :( Ho dovuto cambiarlo in: na_count <- apply (x, function (y) sum (is.na (y)), MARGIN = 2)
Angel Garcia Campos

Non penso che dobbiamo usare sia la somma che la lunghezza (nella prima assegnazione na_count)? Solo la lunghezza dovrebbe essere sufficiente.
Yandle

40

Prova la colSumsfunzione

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

colSums(is.na(df))

#x y 
#1 3 

18

Se stai cercando di contare il numero di NA nell'intero frame di dati, puoi anche utilizzare

sum(is.na(df))

13

In summary()uscita, la funzione conta anche la NAs così si può usare questa funzione se si vuole che la somma di NAs in più variabili.


2
Vale la pena notare che l' summaryoutput quando utilizzato su una singola colonna è utilizzabile, mentre il suo output da un intero frame di dati è carattere e i conteggi sono difficili da estrarre se ne hai bisogno in seguito. Vedere c(summary(mtcars)).
Rich Scriven,

9

Un modo ordinato per contare il numero di null in ogni colonna di un frame di dati:

library(tidyverse)
library(purrr)

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

3
Non hai nemmeno bisogno di purrr:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein,

Se sei pigro come me, puoi scrivere lo stesso nella risposta di @Abi K nella sintassi purrr un po 'più breve di: df %>% map_df(~sum(is.na(.)))o senza dplyr comemap_df(~sum(is.na(df)))
Agile Bean,

7

Questo modulo, leggermente modificato da quello di Kevin Ogoros:

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

restituisce i conteggi NA come array int denominato


per ottenere il risultato come elenco:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

7

Una soluzione Tidyverse semplice e veloce per ottenere un NAconteggio per tutte le colonne è quella di utilizzare, summarise_all()che a mio avviso rende una soluzione molto più semplice da leggere rispetto all'utilizzo di purrrosapply

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

La risposta dell'utente rrs è corretta ma ciò ti dice solo il numero di valori NA nella colonna specifica del frame di dati che stai passando per ottenere il numero di valori NA per l'intero frame di dati prova questo:

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

Questo fa il trucco


Ci sono alcuni errori di battitura che rendono questo codice non funzionale. Prova questo; apply(df, 2, function(x) sum(is.na(x)))
user3495945

3

Ho letto un file CSV dalla directory locale. Il seguente codice funziona per me.

# 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

Simile alla risposta di hute37 ma usando il purrrpacchetto. Penso che questo approccio ordinato sia più semplice della risposta proposta da AbiK.

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

Nota: tilde ( ~) crea una funzione anonima. E il '.' si riferisce all'input per la funzione anonima, in questo caso data.frame df.


0

Puoi usarlo per contare il numero di NA o di spazi vuoti in ogni colonna

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.