11

This reproducible example is a very simplified version of my code:

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

To me, NA (missing value) and NaN (not a number) are two completely different entities, why does na.rm remove NaN? How can I ignore NA and not NaN?

ps:I am using 64-bit R version 3.0.0 on Windows7.

Edit: Upon some more study I found that is.na returns true for NaN too! This is the cause of confusion for me.

is.na(NaN)
> TRUE
Ricardo Oliveros-Ramos
  • 4,322
  • 2
  • 25
  • 42
Nishanth
  • 6,932
  • 5
  • 26
  • 38

2 Answers2

8

It's a language decision:

> is.na(NaN)
[1] TRUE

is.nan differentiates:

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

So you may need to call both.

Matthew Lundberg
  • 42,009
  • 6
  • 90
  • 112
3

na.rm arguments in functions generally use is.na() or an analogous function.
And since is.na(NaN) == TRUE, you then get the behavior you're observing.

Now should NaN be treated as also NA? That is a different question ;)


The best way around this is to explicitly tell R how to handle NaN One example:

ifelse(any(is.nan(x)), NaN, min(x, na.rm=TRUE))
Ricardo Saporta
  • 54,400
  • 17
  • 144
  • 178