2013-04-16 8 views
8

Ten powtarzalny przykładem jest bardzo uproszczona wersja mojego kodu:NaN jest usuwany przy użyciu 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 

Dla mnie NA (brak wartości) i NaN (nie liczba) to dwie zupełnie różne podmioty, dlaczego na.rm usunąć NaN? Jak mogę zignorować NA, a nie NaN?

ps: Używam 64-bitowego R wersji 3.0.0 na Windows7.

Edit: Po niektórych więcej badań stwierdziliśmy, że is.na zwraca true dla NaN też! To jest przyczyną nieładu dla mnie.

is.na(NaN) 
> TRUE 

Odpowiedz

6

Jest to decyzja język:

> is.na(NaN) 
[1] TRUE 

is.nan odróżnia:

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

Więc może trzeba zadzwonić obu.

+0

Tak, właśnie zauważyłem to zachowanie. Mój pomysł na brak wartości musi się zmienić. – Nishanth

+0

@ e4e5f4 Prawdopodobnie nie wybrałbym takiego zachowania, gdybym projektował język. Ale tak właśnie jest. –

+1

Warto zauważyć, że pomoc dla 'sum' stwierdza, że' na.rm = TRUE' usuwa zarówno 'NaN', jak i' NA' (podczas gdy '? Extremes') tego nie robi. – mnel

3

na.rm Argumenty w funkcjach zazwyczaj używają is.na() lub analogicznej funkcji.
I od is.na(NaN) == TRUE, otrzymujesz zachowanie, które obserwujesz.

Teraz powinien NaN być traktowany jako NA? To inna sprawa;)


Najlepszym sposobem na to jest wyraźnie powiedzieć R jak radzić NaN Jeden przykład:

ifelse(any(is.nan(x)), NaN, min(x, na.rm=TRUE)) 
Powiązane problemy