Подмножить фактор по уровням NA

У меня фактор в R, с уровнем NA.

set.seed(1)
x <- sample(c(1, 2, NA), 25, replace=TRUE)
x <- factor(x, exclude = NULL)
> x
 [1] 1    2    2    <NA> 1    <NA> <NA> 2    2    1    1   
[12] 1    <NA> 2    <NA> 2    <NA> <NA> 2    <NA> <NA> 1   
[23] 2    1    1   
Levels: 1 2 <NA>

Как подмножить этот фактор на уровне <NA>? Оба метода, которые я пробовал, не сработали.

> x[is.na(x)]
factor(0)
Levels: 1 2 <NA>
> x[x=='<NA>']
factor(0)
Levels: 1 2 <NA>

person Zach    schedule 26.01.2012    source источник
comment
Вероятно, это одна из причин, по которой ?factor имеет: Предупреждение: существуют некоторые аномалии, связанные с факторами, имеющими уровень «Н/П». Предлагается использовать их экономно, например, только для целей составления таблиц.   -  person Joshua Ulrich    schedule 26.01.2012


Ответы (2)


Удивительно, что ваши попытки сделать это не сработали, но, похоже, это:

x[is.na(levels(x)[x])]

Я попал туда, взглянув на str(x) и увидев, что это уровни, которые являются NA, а не базовые коды:

str(x)
 Factor w/ 3 levels "1","2",NA: 1 2 2 3 1 3 3 2 2 1 ...
person Ben Bolker    schedule 26.01.2012
comment
Я думаю, что x[is.na(as.character(x))] тоже работает. Меня тоже удивило такое поведение. - person joran; 26.01.2012

В продолжение Бена:

str(x) показывает вам проблему. Факторы хранятся внутри как целые числа с своего рода «поиском». Так:

> all(is.na(x))
[1] FALSE

но

> any(is.na(levels(x)))
[1] TRUE

и, как показал Бен, для печати фактических значений вектора:

> levels(x)[x]
 [1] "1" "2" "2" NA  "1" NA  NA  "2" "2" "1" "1" "1" NA  "2" NA  "2" NA  NA  "2" NA  NA       "1" "2" "1" "1"

против

> x
 [1] 1    2    2    <NA> 1    <NA> <NA> 2    2    1    1    1    <NA> 2    <NA> 2    <NA> <NA> 2    <NA> <NA> 1    2    1    1
Levels: 1 2 <NA>
person Justin    schedule 26.01.2012