Déterminez le nombre de valeurs NA dans une colonne


143

Je veux compter le nombre de NAvaleurs dans une colonne de bloc de données. Disons que mon bloc de données est appelé dfet que le nom de la colonne que je considère est col. La façon dont j'ai imaginé est la suivante:

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

Est-ce le moyen le plus efficace / le plus efficace de le faire?

Réponses:


316

Vous réfléchissez trop au problème:

sum(is.na(df$col))

Merci pour ça. Pour élargir un peu cela. En comptant la quantité d'arbitraire value, autre que l' NAécriture d'une fonction booléenne is.valuepuis l'utilisation de sum(is.value(df$col))la voie à suivre ou y a-t-il une syntaxe directe plus concise pour cela?
user3274289

3
Était trop rapide pour demander. sum(df$col==value,na.rm=FALSE)fait l'affaire.
user3274289

4
@ user3274289: bien que vous le souhaitiez généralement na.rm=TRUE, car sinon, s'il df$colcontient des NA, sumil reviendra NA.
jbaums le

1
Parfois, je pense que je réfléchis trop, jusqu'à ce que j'aie cette réponse ... eh bien, c'est vrai ...
Rugal

désolé mais cela ne fonctionne pas pour moi. Je reçois cet avertissement Message d'avertissement: Dans is.na (nom $ wd): is.na () appliqué à non- (liste ou vecteur) de type 'NULL', et le compte est juste zéro.
Herman Toothrot

77

Si vous recherchez des NAnombres pour chaque colonne d'un dataframe, alors:

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

devrait vous donner une liste avec les nombres pour chaque colonne.

na_count <- data.frame(na_count)

Devrait bien afficher les données dans une trame de données comme:

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

1
Pour inclure les noms de ligne sous forme de colonne, exécutez également na_count$name<-rownames(na_count).
Matt

6
na_count <-sapply(x, function(y) sum(is.na(y)))est une alternative plus courte.
Vincent Bonhomme

1
Cela n'a pas fonctionné pour moi :( J'ai dû le changer en: na_count <- apply (x, function (y) sum (is.na (y)), MARGIN = 2)
Angel Garcia Campos

Je ne pense pas que nous devions utiliser à la fois la fonction somme et la fonction length (dans la première affectation na_count)? La longueur juste devrait être suffisante.
Yandle

40

Essayez la colSumsfonction

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

colSums(is.na(df))

#x y 
#1 3 

18

Si vous cherchez à compter le nombre de NA dans l'ensemble de la base de données, vous pouvez également utiliser

sum(is.na(df))

13

En summary()sortie, la fonction compte également les NAs donc on peut utiliser cette fonction si l'on veut la somme de NAs dans plusieurs variables.


2
Il convient de noter que la summarysortie lorsqu'elle est utilisée sur une seule colonne est utilisable, tandis que sa sortie à partir d'un bloc de données entier est un caractère et que les décomptes sont difficiles à extraire si vous en avez besoin plus tard. Voir c(summary(mtcars)).
Rich Scriven

9

Une façon tidyverse de compter le nombre de valeurs nulles dans chaque colonne d'un dataframe:

library(tidyverse)
library(purrr)

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

3
Vous n'avez même pas besoin de ronronnement:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein

Si vous êtes paresseux comme moi, vous pouvez écrire la même chose dans la réponse de @Abi K dans la syntaxe purrr un peu plus courte comme: df %>% map_df(~sum(is.na(.)))ou sans dplyr asmap_df(~sum(is.na(df)))
Agile Bean

7

Cette forme, légèrement modifiée par rapport à celle de Kevin Ogoros:

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

renvoie NA compte comme tableau int nommé


pour obtenir le résultat sous forme de liste:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

7

Une solution Tidyverse rapide et facile pour obtenir un NAcompte pour toutes les colonnes consiste à utiliser summarise_all()ce qui, je pense, rend une solution beaucoup plus facile à lire que d'utiliser purrrousapply

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 réponse de l'utilisateur rrs est correcte, mais cela ne vous indique que le nombre de valeurs NA dans la colonne particulière de la trame de données que vous passez pour obtenir le nombre de valeurs NA pour la trame de données entière, essayez ceci:

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

Cela fait l'affaire


Certaines fautes de frappe rendent ce code non fonctionnel. Essaye ça; apply(df, 2, function(x) sum(is.na(x)))
user3495945

3

J'ai lu un fichier csv à partir du répertoire local. Le code suivant fonctionne pour moi.

# 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

Similaire à la réponse de hute37 mais utilisant le purrrpackage. Je pense que cette approche tidyverse est plus simple que la réponse proposée par AbiK.

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

Remarque: le tilde ( ~) crée une fonction anonyme. Et le '.' fait référence à l'entrée pour la fonction anonyme, dans ce cas le data.frame df.


0

Vous pouvez l'utiliser pour compter le nombre de NA ou de blancs dans chaque colonne

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.