J'ai un facteur nommé SMOKE avec les niveaux "Y" et "N". Les valeurs manquantes ont été remplacées par NA (à partir du niveau initial "NULL"). Cependant, quand je vois le facteur, j'obtiens quelque chose comme ceci:
head(SMOKE)
N N <NA> Y Y N
Levels: Y N
Pourquoi R affiche-t-il NA
sous la forme <NA>
? Et y a-t-il une différence?
Lorsque vous traitez avec factors
, lorsque NA
est enveloppé entre crochets (<NA>
), qui indique qu'il s'agit en fait de NA.
Quand c'est NA
sans parenthèses, alors c'est pas NA, mais plutôt un facteur approprié dont l'étiquette est "NA"
# Note a 'real' NA and a string with the Word "NA"
x <- factor(c("hello", NA, "world", "NA"))
x
[1] hello <NA> world NA
Levels: hello NA world <~~ The string appears as a level, the actual NA does not.
as.numeric(x)
[1] 1 NA 3 2 <~~ The string has a numeric value (here, 2, alphabetically)
The NA's numeric value is just NA
R
essaie simplement de faire la distinction entre une chaîne dont la valeur sont les deux lettres "NA"
et une valeur manquante réelle, NA
Ainsi la différence que vous voyez lors de l'affichage de df
par rapport à df$y
. Exemple:
df <- data.frame(x=1:4, y=c("a", NA_character_, "c", "NA"), stringsAsFactors=FALSE)
Notez les deux styles différents de NA:
> df
x y
1 1 a
2 2 <NA>
3 3 c
4 4 NA
Cependant, si nous regardons juste 'df $ y'
[1] "a" NA "c" "NA"
Mais, si nous supprimons les guillemets (similaires à ce que nous voyons lors de l'impression d'un data.frame sur la console):
print(df$y, quote=FALSE)
[1] a <NA> c NA
Et ainsi, nous avons encore une fois la distinction de NA
via les crochets angulaires.
C'est juste la façon dont R affiche NA
dans un facteur:
> as.factor(NA)
[1] <NA>
Levels:
>
> f <- factor(c(1:3, NA))
> levels(f)
[1] "1" "2" "3"
> f
[1] 1 2 3 <NA>
Levels: 1 2 3
> is.na(f)
[1] FALSE FALSE FALSE TRUE
On suppose que c'est un moyen de différencier NA
et "NA"
dans la façon dont un facteur est imprimé pendant qu'il imprime sans les guillemets, même pour les étiquettes/niveaux de caractères:
> f2 <- factor(c("NA",NA))
> f2
[1] NA <NA>
Levels: NA
> is.na(f2)
[1] FALSE TRUE