R Language
Valeurs manquantes
Recherche…
Introduction
Lorsque nous ne connaissons pas la valeur d'une variable, nous disons que sa valeur est manquante, indiquée par NA
.
Remarques
Les valeurs manquantes sont représentées par le symbole NA
(non disponible). Les valeurs impossibles (par exemple, sqrt(-1)
) sont représentées par le symbole NaN
(pas un nombre).
Examen des données manquantes
anyNA
indique si des valeurs manquantes sont présentes; tandis que is.na
signale les valeurs manquantes
vec <- c(1, 2, 3, NA, 5)
anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE TRUE FALSE
ìs.na
renvoie un vecteur logique contraint à des valeurs entières dans les opérations arithmétiques (avec FALSE = 0, TRUE = 1). Nous pouvons l'utiliser pour déterminer le nombre de valeurs manquantes:
sum(is.na(vec))
# [1] 1
En étendant cette approche, nous pouvons utiliser colSums
et is.na
sur un is.na
de données pour compter les NA par colonne:
colSums(is.na(airquality))
# Ozone Solar.R Wind Temp Month Day
# 37 7 0 0 0 0
Le paquet naniar (actuellement sur github mais pas CRAN) offre d'autres outils pour explorer les valeurs manquantes.
Lecture et écriture de données avec des valeurs NA
Lors de la lecture de jeux de données tabulaires avec les fonctions read.*
, R recherche automatiquement les valeurs manquantes qui ressemblent à "NA"
. Cependant, les valeurs manquantes ne sont pas toujours représentées par NA
. Parfois, un point ( .
), Un tiret ( -
) ou une valeur de caractère (par exemple: empty
) indique qu'une valeur est NA
. Le paramètre na.strings
de la fonction read.*
Peut être utilisé pour indiquer à R quels symboles / caractères doivent être traités comme des valeurs NA
:
read.csv("name_of_csv_file.csv", na.strings = "-")
Il est également possible d'indiquer que plus d'un symbole doit être lu comme NA
:
read.csv('missing.csv', na.strings = c('.','-'))
De même, les NA
peuvent être écrites avec des chaînes personnalisées en utilisant l'argument na
pour write.csv
. D'autres outils pour lire et écrire des tables ont des options similaires.
Utiliser des NA de différentes classes
Le symbole NA
correspond à une valeur logical
manquante:
class(NA)
#[1] "logical"
Ceci est pratique, car il peut facilement être contraint à d'autres types de vecteurs atomiques, et est donc généralement la seule NA
vous aurez besoin:
x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"
Si vous avez besoin d'une seule valeur NA
d'un autre type, utilisez NA_character_
, NA_integer_
, NA_real_
ou NA_complex_
. Pour les valeurs manquantes des classes fantaisies, la mise à NA_integer_
avec NA_integer_
fonctionne généralement; Par exemple, pour obtenir une valeur manquante Date:
class(Sys.Date()[NA_integer_])
# [1] "Date"
VRAI / FAUX et / ou NA
NA
est un type logique et un opérateur logique avec une NA
renvoie NA
si le résultat est ambigu. En dessous, NA OR TRUE
évalué à TRUE
car au moins une des parties est évaluée à TRUE
, cependant NA OR FALSE
renvoie NA
car nous ne savons pas si NA
aurait été TRUE
ou FALSE
NA | TRUE
# [1] TRUE
# TRUE | TRUE is TRUE and FALSE | TRUE is also TRUE.
NA | FALSE
# [1] NA
# TRUE | FALSE is TRUE but FALSE | FALSE is FALSE.
NA & TRUE
# [1] NA
# TRUE & TRUE is TRUE but FALSE & TRUE is FALSE.
NA & FALSE
# [1] FALSE
# TRUE & FALSE is FALSE and FALSE & FALSE is also FALSE.
Ces propriétés sont utiles si vous souhaitez sous-définir un ensemble de données basé sur certaines colonnes contenant NA
.
df <- data.frame(v1=0:9,
v2=c(rep(1:2, each=4), NA, NA),
v3=c(NA, letters[2:10]))
df[df$v2 == 1 & !is.na(df$v2), ]
# v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
df[df$v2 == 1, ]
v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
#NA NA NA <NA>
#NA.1 NA NA <NA>
Omettre ou remplacer les valeurs manquantes
Recodage des valeurs manquantes
Régulièrement, les données manquantes ne sont pas codées comme NA
dans les jeux de données. Dans SPSS par exemple, les valeurs manquantes sont souvent représentées par la valeur 99
.
num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1] 1 2 3 99 5
Il est possible d'attribuer directement NA en utilisant un sous-ensemble
num.vec[num.vec == 99] <- NA
Cependant, la méthode préférée consiste à utiliser is.na<-
comme ci-dessous. Le fichier d'aide ( ?is.na
) indique:
is.na<-
peut fournir un moyen plus sûr de définir les éléments manquants. Il se comporte différemment pour les facteurs, par exemple.
is.na(num.vec) <- num.vec == 99
Les deux méthodes retournent
num.vec
## [1] 1 2 3 NA 5
Supprimer les valeurs manquantes
Les valeurs manquantes peuvent être supprimées de plusieurs manières à partir d'un vecteur:
num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5
Exclure les valeurs manquantes des calculs
Lorsque vous utilisez des fonctions arithmétiques sur des vecteurs avec des valeurs manquantes, une valeur manquante sera renvoyée:
mean(num.vec) # returns: [1] NA
Le paramètre na.rm
indique à la fonction d'exclure les valeurs NA
du calcul:
mean(num.vec, na.rm = TRUE) # returns: [1] 2.75
# an alternative to using 'na.rm = TRUE':
mean(num.vec[!is.na(num.vec)]) # returns: [1] 2.75
Certaines fonctions R, comme lm
, ont un paramètre na.action
. La valeur par défaut pour cela est na.omit
, mais avec les options(na.action = 'na.exclude')
le comportement par défaut de R peut être modifié.
S'il n'est pas nécessaire de modifier le comportement par défaut, mais pour une situation spécifique, une autre na.action
est nécessaire, le paramètre na.action
doit être inclus dans l'appel de fonction, par exemple:
lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')