web-dev-qa-db-fra.com

Quelle est la différence entre <NA> 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 sous la forme <NA>? Et y a-t-il une différence?

42
oort

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

Modifier pour répondre à la question de @ Arun:

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.

46
Ricardo Saporta

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