В чем разница между ‹NA› и NA?

У меня есть фактор с именем SMOKE с уровнями Y и N. Отсутствующие значения были заменены на NA (с начального уровня NULL). Однако, когда я просматриваю фактор, я получаю что-то вроде этого:

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

Почему R отображает NA как <NA>? И есть ли разница?


person oort    schedule 27.04.2013    source источник


Ответы (3)


Когда вы имеете дело с factors, когда NA заключено в угловые скобки ( <NA> ), это означает, что на самом деле это NA.

Когда это NA без скобок, то это не NA, а скорее правильный фактор, метка которого "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

Изменить, чтобы ответить на вопрос @Arun:

R просто пытается отличить строку, значением которой являются две буквы "NA", и фактическое отсутствующее значение, NA Таким образом, разница, которую вы видите при отображении df по сравнению с df$y. Пример:

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

Обратите внимание на два разных стиля АН:

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

Однако, если мы посмотрим только на 'df$y'

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

Но если убрать кавычки (аналогично тому, что мы видим при выводе data.frame на консоль):

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

И, таким образом, у нас снова есть различие NA через угловые скобки.

person Ricardo Saporta    schedule 27.04.2013
comment
Спасибо, что разъяснили это для меня - person oort; 27.04.2013
comment
RicardoSaporta, мне немного непонятно. При проверке этот ответ от @SimonO101 я обнаружил, что если у вас есть data.frame, пример: df <- data.frame(x=1:5, y=c("a", "b", NA_character_, "d"), stringsAsFactors=FALSE), он по-прежнему остается <NA>. Конечно вопрос по векторам. Но все равно мне это непонятно. Пример: когда вы печатаете столбец, df$y он исчезает. Но когда вы печатаете df, он показывает угловые скобки. - person Arun; 01.05.2013
comment
См. также addNA(), например. levels(addNA(x)) - person hadley; 28.02.2014
comment
Также наверное стоит показать это: factor(c("NA", "<NA>", NA)). Глядя на печатное изображение чего-либо, не лучший способ понять, что это такое! - person hadley; 28.02.2014

Точно так же R отображает NA в множителе:

> 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

Можно предположить, что это средство, с помощью которого можно различать NA и "NA" в том, как фактор печатается, поскольку он печатается без кавычек, даже для меток/уровней символов:

> f2 <- factor(c("NA",NA))
> f2
[1] NA   <NA>
Levels: NA
> is.na(f2)
[1] FALSE  TRUE
person Gavin Simpson    schedule 27.04.2013

Возможно, одним исключением может быть data.table. Там кажется, что символьное поле печатает его как ‹ NA >, а числовое - как NA. NB: я добавил дополнительные пробелы в ‹ NA >, иначе эта веб-страница не отображала его должным образом.

library("data.table")

y<-data.table(a=c("a","b",NA))

print(y)
      a
1:    a
2:    b
3: < NA >

factor(y$a)

[1] a    b    < NA >

Levels: a b

## we enter a numeric argument

y<-data.table(a=c(1,2,NA))

print(y)
    a
1:  1
2:  2
3: NA

factor(y$a)

[1] 1    2    < NA >

Levels: 1 2
person guest    schedule 19.12.2018
comment
Я не уверен, что это за исключение. Приведенные выше ответы по существу говорят, что когда NA находится в factor или character, оно печатается как <NA>. Это то же самое, что вы демонстрируете, используя data.table. - person Gregor Thomas; 20.12.2018