2012-01-26 19 views
8

Tôi có một yếu tố trong R, với mức NA.Tập hợp một hệ số theo cấp 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> 

Làm cách nào để chọn yếu tố đó theo cấp độ <NA>? Cả hai phương pháp tôi đã thử đều không hoạt động.

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

Đây có lẽ là một lý do '? factor' có:" Cảnh báo: Có một số dị thường liên quan đến w các yếu tố thứ i có ‘NA’ ở mức độ. Chúng tôi đề xuất sử dụng chúng một cách tiết kiệm, ví dụ: chỉ cho mục đích lập bảng. " –

Trả lời

8

ngạc nhiên với tôi rằng nỗ lực của bạn để làm điều này không hiệu quả, nhưng điều này dường như:

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

tôi đến đó bằng cách nhìn vào str(x) và thấy rằng nó là mức rằng là NA, không phải là mã cơ bản:

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

Tôi nghĩ rằng' x [is.na (as.character (x))] 'cũng hoạt động. Tôi cũng rất ngạc nhiên về hành vi này. – joran

3

là một theo dõi để Ben:

str(x) hiển thị cho bạn sự cố. Các yếu tố được lưu trữ dưới dạng số nguyên nội bộ với một "tra cứu" các loại. Vì vậy:

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

nhưng

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

và như ben cho thấy, để in các giá trị thực tế của 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" 

so

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