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?

34
demandé sur Spacedman 2013-04-27 19:24:13

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.

38
répondu Ricardo Saporta 2013-05-01 20:43:37

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
8
répondu Gavin Simpson 2013-04-27 15:29:27