[R] binary operators that never return missing values

David Winsemius dwinsemius at comcast.net
Thu Jun 21 01:20:02 CEST 2012


On Jun 20, 2012, at 5:18 PM, Anthony Damico 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%  ...
>
> 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

There is the capacity to define new infix operators:

?`%in%    # which also never returns NA

 > a <- c( 1 , NA , 7 , 2 , NA )
 > b <- c( NA , NA , 9 , 1 , 6 )
 >
 > `%>%` <- function(x,y) ifelse( is.na(x)|is.na(y), FALSE, x > y)
 > a %>% b
[1] FALSE FALSE FALSE  TRUE FALSE
 > `%<%` <- function(x,y) ifelse( is.na(x)|is.na(y), FALSE, x < y)
 > a %<% b
[1] FALSE FALSE  TRUE FALSE FALSE

--  
David.
>
> 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.
>
> ______________________________________________
> 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.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list