2012-01-26 48 views
8

द्वारा एक कारक सब्सक्राइब करें मेरे पास एनए स्तर के साथ आर में एक कारक है।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> 
+2

यह शायद एक कारण है 'कारक 'में है:" चेतावनी: कुछ विसंगतियां डब्ल्यू हैं ith कारक जिनके पास 'एनए' स्तर है। यह उन्हें कम से कम उपयोग करने का सुझाव दिया जाता है, उदाहरण के लिए, केवल सारणीकरण उद्देश्यों के लिए। " –

उत्तर

8

मुझे लगता है कि यह करने के लिए अपने प्रयास काम नहीं किया चौंकाने वाले हैं, लेकिन यह लगता है:

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 ... 
+1

मुझे लगता है कि 'x [is.na (as.character (x))]' भी काम करता है। मैं इस व्यवहार पर भी आश्चर्यचकित था। – joran

3

के रूप में एक बेन अप करने के लिए का पालन करें:

+०१२३५१६४१०६

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>