Quelle est la différence entre et NA?
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
comme <NA>
? Et est-il une différence?
2 réponses
Lorsque vous avez affaire à factors
, lorsque le NA
est enveloppé dans des crochets inclinés ( <NA>
), cela indique qu'il est en fait NA.
Quand il est NA
, sans les crochets, puis il est pas NA, mais plutôt un bon facteur 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
Modifier pour répondre à la question de @Arun:
R
essaie simplement de distinguer 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
contre 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 (similaire à ce que nous voyons lors de l'impression d'une donnée.cadre à 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 inclinés.
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 par lequel on ferait la différence entre NA
et "NA"
dans la façon dont un facteur est imprimé comme il imprime sans les guillemets, même pour les étiquettes de caractères / niveaux:
> f2 <- factor(c("NA",NA))
> f2
[1] NA <NA>
Levels: NA
> is.na(f2)
[1] FALSE TRUE