[R] NaN, Inf to NA

William Dunlap wdunlap at tibco.com
Fri May 27 17:18:46 CEST 2011


> -----Original Message-----
> From: Duncan Murdoch [mailto:murdoch.duncan at gmail.com] 
> Sent: Friday, May 27, 2011 5:23 AM
> To: Albert-Jan Roskam
> Cc: William Dunlap; Marc Schwartz; R Mailing List
> Subject: Re: [R] NaN, Inf to NA
> 
> On 11-05-27 4:27 AM, Albert-Jan Roskam wrote:
> > Aha! Thank you very much for that clarification! It would 
> be much more user
> > friendly if R generated a NotImplementedError or something 
> similar. The 'garbage
> > results' are pretty misleading, esp. to a novice.
> 
> I think that's a good idea.  The default methods are 
> documented to work 
> on atomic vectors; dataframes are not atomic vectors, so it would be 
> reasonable to generate an error.  (See ?is.atomic for a definition of 
> atomic vectors.)
> 
> I'll see if this causes a lot of trouble...
> 
> Duncan Murdoch

One of my beefs about the S3 and S4 object systems is
that the "default" or "ANY" method is often used for
both the the simple (atomic, matrix of atomic, named
atomic, etc.) classes and for any class the writer
hasn't thought of.  It can be difficult to write code
that works well in both cases.

I've tried just omitting the default method to avoid
the problem.  I end up writing a lot of identical
methods for the the simple cases, but I get the error
checking that I want.  E.g.,

  > omitZero <- function(x) UseMethod("omitZero")
  > omitZero.numeric <- function(x)x[x!=0]
  > omitZero.integer <- function(x)x[x!=0]
  > omitZero.complex <- function(x)x[x!=0]
  > omitZero(c(1L,2L,0L,4L))
  [1] 1 2 4
  > omitZero(c(TRUE,TRUE,FALSE))
  Error in UseMethod("omitZero") : 
    no applicable method for 'omitZero' applied to an object of class
"logical"
  > omitZero(data.frame(logical=c(TRUE,TRUE,FALSE)))
  Error in UseMethod("omitZero") : 
    no applicable method for 'omitZero' applied to an object of class
"data.frame"
  > omitZero(c(one=1,zero=0,five=5))
   one five 
     1    5 
  > omitZero(matrix(0:3,2,2))
  [1] 1 2 3

In other situations the default case may work, perhaps slowly, for
all classes but I'll add special code for the simple classes so they
get dealt with more efficiently.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com  

> 
> 
> >
> > I wanted to recode every NaN and Inf value of an entire 
> data.frame to NA. The
> > data.frame also includes character variables. So the 
> following might work (?)
> > (Can't test it here)
> >
> > ditch<- function(x) ifelse(is.infinite(x) | is.nan(x), NA, x)
> > df<- apply(df, 2, ditch)
> >
> >
> >
> >
> >
> > ________________________________
> > From: William Dunlap<wdunlap at tibco.com>
> >
> > Cc: R Mailing List<r-help at r-project.org>
> > Sent: Fri, May 27, 2011 12:57:01 AM
> > Subject: RE: [R] NaN, Inf to NA
> >
> > I think the source of the OP's problem is that
> > while things like df>30 and is.na(df) return
> > a logical matrix with the dimensions of the
> > data.frame df, both is.infinite(df) and is.nan(df)
> > return a logical vector as long as the number
> > of columns of df.  (`>` and is.na have data.frame
> > methods but is.infinite and is.nan do not: the latter
> > give garbage results for data.frames.)
> >
> > Bill Dunlap
> > Spotfire, TIBCO Software
> > wdunlap tibco.com
> >
> >> -----Original Message-----
> >> From: r-help-bounces at r-project.org
> >> [mailto:r-help-bounces at r-project.org] On Behalf Of Marc Schwartz
> >> Sent: Thursday, May 26, 2011 2:15 PM
> >> To: Albert-Jan Roskam
> >> Cc: R Mailing List
> >> Subject: Re: [R] NaN, Inf to NA
> >>
> >> On May 26, 2011, at 3:18 PM, Albert-Jan Roskam wrote:
> >>
> >>> Hi,
> >>>
> >>> I want to recode all Inf and NaN values to NA, but I;m
> >> surprised to see the
> >>> result of the following code. Could anybody enlighten me
> >> about this?
> >>>
> >>>> df<- data.frame(a=c(NA, NaN, Inf, 1:3))
> >>>> df[is.infinite(df) | is.nan(df)]<- NA
> >>>> df
> >>>     a
> >>> 1  NA
> >>> 2 NaN
> >>> 3 Inf
> >>> 4   1
> >>> 5   2
> >>> 6   3
> >>>>
> >>>
> >>>
> >>> Thanks!
> >>>
> >>> Cheers!!
> >>> Albert-Jan
> >>
> >>
> >> The canonical way is to use is.na() to assign the NA value
> >> based upon a condition. See ?is.na for more information.
> >>
> >> is.na(df$a)<- !is.finite(df$a)
> >>
> >>> df
> >>     a
> >> 1 NA
> >> 2 NA
> >> 3 NA
> >> 4  1
> >> 5  2
> >> 6  3
> >>
> >>
> >> HTH,
> >>
> >> Marc Schwartz
> >>
> >> ______________________________________________
> >> R-help at r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> PLEASE do read the posting guide
> >> http://www.R-project.org/posting-guide.html
> >> and provide commented, minimal, self-contained, reproducible code.
> >>
> >
> > 	[[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide 
> http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> 
> 



More information about the R-help mailing list