2012-01-26 9 views
8

Ho un fattore in R, con un livello NA.Sottoinsieme un fattore per i livelli 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> 

Come si imposta questo fattore per il livello <NA>? Entrambi i metodi che ho provato non hanno funzionato.

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

Questo è probabilmente uno dei motivi '? factor' ha:" Attenzione: ci sono alcune anomalie associate w con fattori che hanno 'NA' come livello. Si suggerisce di usarli con parsimonia, ad esempio solo a scopo di tabulazione. " –

risposta

8

sorprendente per me che i tentativi di fare questo non ha funzionato, ma questo sembra:

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

sono arrivato, cercando in str(x) e visto che sono i livelli che sono NA, non i codici sottostanti:

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

Penso che anche' x [is.na (as.character (x))] 'funzioni anch'io. – joran

3

Come seguito a Ben:

01.235.164,106 mila

str(x) indica il problema. I fattori vengono memorizzati internamente con una "ricerca" di sorta. Quindi:

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

ma

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

e, come ha dimostrato Ben, per stampare i valori effettivi del vettore:

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

contro

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