2013-04-16 30 views
8

dụ tái sản xuất này là một phiên bản rất đơn giản của mã của tôi:NaN được lấy ra khi sử dụng na.rm = TRUE

x <- c(NaN, 2, 3) 

#This is fine, as expected 
max(x) 
> NaN 

#Why does na.rm remove NaN? 
max(x, na.rm=TRUE) 
> 3 

Đối với tôi, NA (thiếu giá trị) và NaN (không phải là số) là hai hoàn toàn các thực thể khác nhau, tại sao na.rm xóa NaN? Làm cách nào để bỏ qua NA và không phải NaN?

ps: Tôi đang sử dụng phiên bản R bit 64 bit 3.0.0 trên Windows7.

Chỉnh sửa: Sau khi tìm hiểu thêm, tôi thấy rằng is.na cũng trả về true cho NaN quá! Đây là nguyên nhân gây nhầm lẫn cho tôi.

is.na(NaN) 
> TRUE 

Trả lời

6

Đó là một quyết định ngôn ngữ:

> is.na(NaN) 
[1] TRUE 

is.nan biệt:

> is.nan(NaN) 
[1] TRUE 
> is.nan(NA) 
[1] FALSE 

Vì vậy, bạn có thể cần phải gọi cả hai.

+0

Vâng, tôi chỉ nhận thấy hành vi này. Ý tưởng của tôi về giá trị thiếu cần phải thay đổi. – Nishanth

+0

@ e4e5f4 Tôi có lẽ sẽ không chọn hành vi này, tôi có đang thiết kế ngôn ngữ không. Nhưng đó là những gì nó được. –

+1

Thật thú vị khi lưu ý rằng trợ giúp cho 'sum' nói rằng' na.rm = TRUE' sẽ loại bỏ cả hai 'NaN' và' NA' (trong khi '? Extremes') thì không. – mnel

3

na.rm đối số trong các hàm thường sử dụng is.na() hoặc một hàm tương tự.
Và kể từ is.na(NaN) == TRUE, bạn sẽ nhận được hành vi mà bạn đang quan sát.

Bây giờ nên NaN cũng được coi là NA? Đó là một câu hỏi khác nhau;)


Cách tốt nhất xung quanh này là để nói một cách rõ ràng R cách xử lý NaN Một ví dụ:

ifelse(any(is.nan(x)), NaN, min(x, na.rm=TRUE))