Jaka jest różnica między i NA?

Mam czynnik o nazwie dym z poziomami " Y " I "N". Brakujące wartości zostały zastąpione przez NA (od początkowego poziomu "NULL"). Jednak gdy widzę czynnik dostaję coś takiego:

head(SMOKE)
N N <NA> Y Y N
Levels: Y N

Dlaczego r wyświetla NA jako <NA>? A jest jakaś różnica?

Author: Spacedman, 2013-04-27

2 answers

Gdy mamy do czynienia z factors, gdy NA jest zawinięty w nawiasy kątowe (<NA>), oznacza to, że w rzeczywistości jest to NA.

Gdy jest NA bez nawiasów, to jest Nie NA, ale raczej odpowiednim czynnikiem, którego etykietą jest "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

Edit to answer @ Arun ' s question:

R po prostu próbuje odróżnić łańcuch, którego wartością są dwie litery "NA", a rzeczywistą brakującą wartością NA Tak więc różnica, którą widzisz podczas wyświetlania df versus df$y. Przykład:

df <- data.frame(x=1:4, y=c("a", NA_character_, "c", "NA"), stringsAsFactors=FALSE)

Zwróć uwagę na dwa różne style NA:

> df
  x    y
1 1    a
2 2 <NA>
3 3    c
4 4   NA

Jednakże, jeśli spojrzymy tylko na 'df$y'

[1] "a"  NA   "c"  "NA"

Ale jeśli usuniemy cudzysłów (podobny do tego, co widzimy podczas drukowania danych.ramka do konsoli):

print(df$y, quote=FALSE)
[1] a    <NA> c    NA  

I tak, po raz kolejny mamy rozróżnienie NA za pomocą nawiasów kątowych.

 38
Author: Ricardo Saporta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-01 20:43:37

Jest to po prostu sposób, w jaki r wyświetla NA w współczynniku:

> 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

Zakłada się, że jest to sposób, za pomocą którego można odróżnić NA i "NA" w sposób, w jaki czynnik jest drukowany, ponieważ drukuje bez cudzysłowów, nawet dla etykiet/poziomów znaków:

> f2 <- factor(c("NA",NA))
> f2
[1] NA   <NA>
Levels: NA
> is.na(f2)
[1] FALSE  TRUE
 8
Author: Gavin Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-27 15:29:27