Une manière élégante de signaler les valeurs manquantes dans un data.frame

Voici un petit morceau de code que j’ai écrit pour signaler les variables avec des valeurs manquantes dans un bloc de données. J’essaie de penser à une manière plus élégante de le faire, qui renvoie peut-être un data.frame, mais je suis coincé:

for (Var in names(airquality)) { missing  0) { print(c(Var,missing)) } } 

Edit: je traite des data.frames avec des dizaines à des centaines de variables, il est donc essentiel de ne rapporter que les variables avec des valeurs manquantes.

Utilisez simplement sapply

 > sapply(airquality, function(x) sum(is.na(x))) Ozone Solar.R Wind Temp Month Day 37 7 0 0 0 0 

Vous pouvez également utiliser apply ou colSums sur la masortingce créée par is.na()

 > apply(is.na(airquality),2,sum) Ozone Solar.R Wind Temp Month Day 37 7 0 0 0 0 > colSums(is.na(airquality)) Ozone Solar.R Wind Temp Month Day 37 7 0 0 0 0 

Plus succinct -: sum(is.na(x[1]))

C’est

  1. x[1] Regardez la première colonne

  2. is.na() true si c’est NA

  3. sum() TRUE est 1 , FALSE est 0

Nous pouvons utiliser map_df avec purrr.

 library(mice) library(purrr) # map_df with purrr map_df(airquality, function(x) sum(is.na(x))) # A tibble: 1 × 6 # Ozone Solar.R Wind Temp Month Day #       # 1 37 7 0 0 0 0 

Une autre alternative graphique – la fonction plot_missing d’un excellent package DataExplorer :

entrer la description de l'image ici

Docs souligne également que vous pouvez enregistrer ces résultats pour des parsings supplémentaires avec missing_data <- plot_missing(data) .

 summary(airquality) 

vous donne déjà cette information

Les packages VIM offrent également de belles tracés de données manquantes pour data.frame

 library("VIM") aggr(airquality) 

entrer la description de l'image ici

Une autre fonction qui vous aiderait à regarder les données manquantes serait df_status de la bibliothèque funModeling

 library(funModeling) 

iris.2 est le jeu de données de l’iris avec quelques NA ajoutés. Vous pouvez le remplacer par votre jeu de données.

 df_status(iris.2) 

Cela vous donnera le nombre et le pourcentage d’AN dans chaque colonne.

Mon nouveau favori pour les données (pas trop larges) sont les méthodes d’un excellent package naniar . Non seulement vous obtenez des fréquences mais aussi des modèles de disparition:

 library(naniar) library(UpSetR) riskfactors %>% as_shadow_upset() %>% upset() 

entrer la description de l'image ici

Il est souvent utile de voir où se situent les manquements par rapport aux non-manquants, en traçant un diagramme de dispersion avec les manquants:

 ggplot(airquality, aes(x = Ozone, y = Solar.R)) + geom_miss_point() 

entrer la description de l'image ici

Ou pour les variables catégorielles:

 gg_miss_fct(x = riskfactors, fct = marital) 

entrer la description de l'image ici

Ces exemples proviennent d’une vignette de package qui répertorie d’autres visualisations intéressantes.

Une autre manière graphique et interactive consiste à utiliser la fonction heatmaply bibliothèque heatmaply :

 library(heatmaply) heatmaply(is.na10(airquality), grid_gap = 1, showticklabels = c(T,F), k_col =3, k_row = 3, margins = c(55, 30), colors = c("grey80", "grey20")) 

entrer la description de l'image ici

Ne fonctionnera probablement pas bien avec les grands ensembles de données.

Si vous voulez le faire pour une colonne particulière, vous pouvez également l’utiliser

 length(which(is.na(airquality[1])==T)) 

Pour une solution graphique supplémentaire, le package vis_miss propose vis_miss .

 library(visdat) vis_miss(airquality) 

entrer la description de l'image ici

Très similaire à la sortie d’ Amelia avec une petite différence de donner% s aux ratés.

Je pense que la bibliothèque Amelia fait un bon travail dans le traitement des données manquantes et comprend également une carte pour visualiser les lignes manquantes.

 install.packages("Amelia") library(Amelia) missmap(airquality) 

entrer la description de l'image ici

Vous pouvez également exécuter le code suivant pour retourner les valeurs logiques de na

 row.has.na <- apply(training, 1, function(x){any(is.na(x))})