2012-01-26 14 views
8

Mam współczynnik w R, z poziomem NA.Podzbiór współczynnik przez poziomy 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> 

W jaki sposób podzielić ten czynnik według poziomu <NA>? Obie metody, które wypróbowałem, nie działały.

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

Jest to prawdopodobnie jeden z powodów, '? factor' ma:" Ostrzeżenie: W niektórych przypadkach występują pewne anomalie z czynnikami, które mają "NA" jako poziom. Sugeruje się, aby używać ich oszczędnie, np. Tylko do celów tabelarycznych. " –

Odpowiedz

8

dziwi mnie, że próbuje to zrobić nie działa, ale wydaje się to:

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

mam tam patrząc na str(x) i widząc, że to że poziomyNA, a nie kody bazowe:

str(x) 
Factor w/ 3 levels "1","2",NA: 1 2 2 3 1 3 3 2 2 1 ... 
+1

Myślę, że również" x [is.na (as.character (x))] "również było zaskoczone. – joran

3

jako uzupełnienie do Bena:

str(x) pokazuje ci problem. Czynniki są przechowywane jako liczby całkowite wewnętrznie za pomocą "wyszukiwania". Więc:

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

ale

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

i jak ben pokazał, drukować rzeczywiste wartości wektora:

> 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" 

kontra

> 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>