[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