2012-10-23 32 views
12

Nếu tôi đã làm điều này, tôi nhận được kết quả chính xác:NA Tránh trong as.numeric()

a <- c("10","28","3") 
which(as.numeric(a) == min(as.numeric(a))) 
[1] 3 

Nhưng nếu có NA trong vector, sau đó có một vấn đề

a <- c("10","28","3","NA") 
which(as.numeric(a) == min(as.numeric(a))) 
integer(0) 
Warning messages: 
1: In which(as.numeric(a) == min(as.numeric(a))) : 
    NAs introduced by coercion 
2: In which(as.numeric(a) == min(as.numeric(a))) : 
    NAs introduced by coercion 
+0

Không cần cho R trong tiêu đề, cho rằng bạn có nó được gắn thẻ như r – mnel

Trả lời

12

Hai nhiều thứ.

Đầu tiên, có sự khác biệt giữa chuỗi ký tự "NA" và biểu diễn dữ liệu R cho các giá trị bị thiếu, NA. Hủy bỏ các dấu ngoặc kép quanh NA trong ví dụ của bạn để xem:

a <- c("10","28","3",NA) 

Thứ hai, khi bạn đang sử dụng min với giá trị còn thiếu thực tế (tức là không phải là chuỗi kí tự "NA"), bạn sẽ muốn sử dụng na.rm = TRUE:

which(as.numeric(a) == min(as.numeric(a),na.rm = TRUE)) 
+0

Bạn đang đúng về việc chỉ ra "NA". Nó là một lỗi đánh máy. Nó có nghĩa là một NA cho các giá trị bị thiếu. Cảm ơn vì giải pháp của bạn. – Selvam

+1

Bạn cũng có thể muốn sử dụng 'which.min' – hadley

8

vấn đề chính của bạn không được xác định na.rm = TRUE trong cuộc gọi đến min

numeric_a <- as.numeric(a) 

which(numeric_a == min(numeric_a, na.rm = TRUE)) 
## [1] 3 

Hoặc bạn có thể sử dụng which.min không yêu cầu bạn chỉ định rằng các giá trị NA phải được loại bỏ. Điều này sẽ chỉ cho bạn những trận đấu đầu tiên, không phải tất cả các trận đấu (Cảm ơn @Dason đã nhắc nhở tôi để làm rõ điều này)

which.min(numeric_a) 
+3

Nhưng nếu bạn sử dụng' which.min' chỉ cần lưu ý rằng bạn sẽ chỉ nhận được một kết quả duy nhất ngay cả khi có nhiều giá trị khớp với giá trị tối thiểu. – Dason

+1

mnel và Dason, cảm ơn cả hai người để minh họa thêm về giải pháp. – Selvam

Các vấn đề liên quan