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?

user3274289
la source

Réponses:

316

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

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

Shahin
la source
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)
Abi K
la source
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é

hute37
la source
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
Moohan
la source
3

Essaye ça:

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

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

Chris Kiniry
la source
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 == '')
Prakhar Srivastava
la source
0
sapply(name of the data, function(x) sum(is.na(x)))
UTKARSH
la source
Voir " Expliquer les réponses entièrement basées sur le code ". Bien que cela puisse être techniquement correct, cela n'explique pas pourquoi cela résout le problème ou devrait être la réponse choisie. Nous devons éduquer en plus pour aider à résoudre le problème.
The Tin Man