2012-01-26 14 views
8

Tengo un factor en R, con un nivel de NA.Subconjunto un factor por niveles de 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> 

¿Cómo subconjunto ese factor por el nivel <NA>? Ambos métodos que probé no funcionaron.

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

Esta es probablemente una de las razones '? factor' tiene:" Advertencia: hay algunas anomalías asociadas w con factores que tienen 'NA' como un nivel. Se sugiere usarlos con moderación, por ejemplo, solo para fines de tabulación. " –

Respuesta

8

sorprendente para mí que sus intentos de hacer esto no funcionó, pero esto parece:

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

llegué allí mirando str(x) y al ver que se trata de los niveles que NA son, no los códigos subyacentes:

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

Creo que' x [is.na (as.character (x))] 'también funciona. Me sorprendió también este comportamiento. – joran

3

Como seguimiento a Ben:

str(x) le muestra el problema. Los factores se almacenan como enteros internamente con una especie de "búsqueda". Por lo tanto:

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

pero

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

y como se mostró ben, para imprimir los valores reales del vector:

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

frente

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