2013-04-16 20 views
8

Questo esempio riproducibile è una versione molto semplificata del mio codice:NaN viene rimosso quando si utilizza 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 

Per me, NA (valore mancante) e NaN (non un numero) sono due completamente entità diverse, perché na.rm rimuovere NaN? Come posso ignorare NA e non NaN?

ps: sto usando la versione R a 64 bit 3.0.0 su Windows7.

Edit: Al momento ancora un po 'di studio ho scoperto che is.na restituisce vero per NaN troppo! Questa è la causa della confusione per me.

is.na(NaN) 
> TRUE 

risposta

6

E 'una decisione la lingua:

> is.na(NaN) 
[1] TRUE 

is.nan differenzia:

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

quindi potrebbe essere necessario chiamare entrambi.

+0

Sì, ho appena notato questo comportamento. La mia idea del valore mancante deve cambiare. – Nishanth

+0

@ e4e5f4 Probabilmente non avrei scelto questo comportamento, stavo progettando la lingua. Ma è quello che è. –

+1

È interessante notare che l'aiuto per 'sum' afferma che' na.rm = TRUE' rimuoverà sia 'NaN' che' NA' (mentre '? Extremes') no. – mnel

3

na.rm gli argomenti nelle funzioni generalmente utilizzano is.na() o una funzione analoga.
E dal is.na(NaN) == TRUE, si ottiene il comportamento che si sta osservando.

Ora dovrebbe essere NaN essere trattato come anche NA? Questa è una domanda diversa;)


Il modo migliore per aggirare questo è per dire esplicitamente R come gestire NaN Un esempio:

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