web-dev-qa-db-fra.com

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 les valeurs manquantes d'un bloc de données. J'essaie de trouver une façon plus élégante de faire cela, une méthode qui renvoie peut-être un nom de données.fr, mais je suis bloquée:

for (Var in names(airquality)) {
    missing <- sum(is.na(airquality[,Var]))
    if (missing > 0) {
        print(c(Var,missing))
    }
}

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

71
Zach

Il suffit d'utiliser 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 matrice 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 
138
Joshua Ulrich

On peut 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
# <int>   <int> <int> <int> <int> <int>
# 1    37       7     0     0     0     0
7
Keiku

Mon nouveau favori pour les données (pas trop larges) sont les méthodes de l'excellent paquet naniar . Vous obtenez non seulement des fréquences mais également des motifs de manque:

library(naniar)
library(UpSetR)

riskfactors %>%
  as_shadow_upset() %>%
  upset()

enter image description here

Il est souvent utile de voir où se situent les données manquantes par rapport à la valeur non manquante, ce qui peut être obtenu en traçant un nuage de points avec des données manquantes:

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

enter image description here

Ou pour les variables catégoriques:

gg_miss_fct(x = riskfactors, fct = marital)

enter image description here

Ces exemples proviennent du paquet vignette qui répertorie d'autres visualisations intéressantes.

5
radek

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

C'est

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

  2. is.na() vrai s'il s'agit de NA

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

5
Keith Whittingham
summary(airquality)

te donne déjà cette information

Les packages [~ # ~] vim [~ # ~] offrent également des courbes de données manquantes de Nice pour data.frame.

library("VIM")
aggr(airquality)

enter image description here

4
stats0007

Une autre alternative graphique - la fonction plot_missing De l'excellent paquet DataExplorer:

enter image description here

Docs signale également que vous pouvez enregistrer ces résultats pour une analyse supplémentaire avec missing_data <- plot_missing(data).

4
radek

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

library(funModeling)

iris.2 est le jeu de données 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.

2
Shahan Degamwala

Pour une solution graphique supplémentaire, visdatpackage offre vis_miss.

library(visdat)
vis_miss(airquality)

enter image description here

Très similaire à la sortie de Amelia avec une petite différence entre donner% s sur les ratés prêts à l'emploi.

1
radek

Une autre façon graphique et interactive consiste à utiliser is.na10 fonction de la 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"))

enter image description here

Cela ne fonctionnera probablement pas bien avec de grands ensembles de données.

1
radek

Si vous voulez le faire pour une colonne en particulier, vous pouvez également utiliser cette option.

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

Je pense que la bibliothèque Amelia fait un travail agréable dans la gestion des données manquantes. Elle inclut également une carte permettant de visualiser les lignes manquantes.

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

enter image description here

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

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

Fonction du package d’ExPanDaR prepare_missing_values_graph peut être utilisé pour explorer les données de panel:

enter image description here

0
radek