Подтвердить что ты не робот

В чем разница между <NA> и NA?

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

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

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

4b9b3361

Ответ 1

Когда вы имеете дело с 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 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)

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

> 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 через угловые скобки.

Ответ 2

Именно так 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

Ответ 3

Возможно, одно исключение может быть 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