[R] binary operators that never return missing values

R. Michael Weylandt michael.weylandt at gmail.com
Wed Jun 20 23:36:26 CEST 2012


On Wed, Jun 20, 2012 at 4:18 PM, Anthony Damico <ajdamico at gmail.com> wrote:
> Thanks Michael,
>
> I was hoping to complete this in one step (since I use these a lot).
> Setting the class of the vectors seems like more typing than just
> doing %>F%  ...

Hmmm..... my way save you 3 characters (and three shifts!) per
comparison, and takes maybe 20 (depending on your class name) once,
but it's a personal choice.

>
> Unfortunately, my knowledge of classes, methods, and the like is
> pretty shaky.  Is it possible to *create* another set of operators
> that just changes NAs to falses or trues?--
>
>>F  <F  >=F  <=F  >T  <T  >=T  <=T

Unfortunately, I think you can't use these like this and have to use
the infix versions with the parser as is. No way to do this
automatically that I know of -- but you can just put it in a text
editor and do some copy and paste work and then have a source()-able
file for each session.

Others may have some smart ideas.

Best,
Michael

>
> I definitely don't want to change the base functionality of the
> operators, so infix notation seems like the strategy that will require
> the least typing in the long run..  but my mind is still open. :)
>
>
>
> On Wed, Jun 20, 2012 at 4:54 PM, R. Michael Weylandt
> <michael.weylandt at gmail.com> wrote:
>> Hi Anthony,
>>
>> No, I don't believe this exists on CRAN already (happy to be proven
>> wrong though) but I might suggest you approach things a different way:
>> instead of defining this operator by operator with infix notation, why
>> not go after `+`, `>` directly? If you put a class on your vectors,
>> you can define Ops.class which will change the behavior of all those
>> sorts of things.
>>
>> Simple example (probably not complete nor necessarily advisable)
>>
>> a <- c( 1 , NA , 7 , 2 , NA )
>> b <- c( NA , NA , 9 , 1 , 6 )
>>
>> class(a) <- class(b) <- "damico"
>>
>> Ops.damico <- function(e1, e2 = NULL){
>>    e1[is.na(e1)] <- 0
>>    e2[is.na(e2)] <- 0
>>    NextMethod()
>> }
>>
>> a < b
>>
>> More nuance is available, but this hopefully gives you a start. You
>> might, e.g., think about setting this as something more like:
>>
>> Ops.damico <- function(e1, e2 = NULL){
>>    if(.Generic %in% c("==","!=","<","<=",">=",">")){
>>        e1[is.na(e1)] <- 0
>>        e2[is.na(e2)] <- 0
>>    }
>>    NextMethod()
>> }
>>
>> so you don't mess up arithmetic but only the boolean comparisons.
>>
>> Best,
>> Michael
>>
>> On Wed, Jun 20, 2012 at 3:44 PM, Anthony Damico <ajdamico at gmail.com> wrote:
>>> Hi, I work with data sets with lots of missing values.  We often need
>>> to conduct logical tests on numeric vectors containing missing values.
>>>  I've searched around for material and conversations on this topic,
>>> but I'm having a hard time finding anything.  Has anyone written a
>>> package that deals with this sort of thing?  All I want are a group of
>>> functions like the ones I've posted below, but I'm worried I'm
>>> re-inventing the wheel..  If they're not already on CRAN, I feel like
>>> I should add them.  Any pointers to work already completed on this
>>> subject would be appreciated.  Thanks!
>>>
>>> Anthony Damico
>>> Kaiser Family Foundation
>>>
>>>
>>>
>>> Here's a simple example of what I need done on a regular basis:
>>>
>>> #two numeric vectors
>>> a <- c( 1 , NA , 7 , 2 , NA )
>>>
>>> b <- c( NA , NA , 9 , 1 , 6 )
>>>
>>> #this has lots of NAs
>>> a > b
>>>
>>> #save this result in x
>>> x <- (a > b)
>>>
>>> #overwrite NAs in x with falses (which we do a lot)
>>> x <- ifelse( is.na( x ) , F , x )
>>>
>>> #now x has only trues and falses
>>> x
>>>
>>>
>>>
>>> ################
>>> Here's an example function that solves the problem for "greater than"
>>> ################
>>>
>>>
>>> #construct a function that performs the same steps:
>>> "%>F%" <-
>>>        function( a , b ){
>>>
>>>                x <- (a > b)
>>>
>>>                x.false <- ifelse( is.na( x ) , F , x )
>>>
>>>                x.false
>>>
>>>        }
>>>
>>> #run the function
>>>
>>> a %>F% b
>>>
>>> ______________________________________________
>>> 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