[R] Testing for Inequality à la "select case"

diegol diegol81 at gmail.com
Sun Mar 15 23:34:25 CET 2009


Hello Stavros,

> If you'd do it element-by-element in Excel, why not do it
> element-by-element in R?

Well, actually I was hoping for a vectorized solution so as to avoid
looping. I need to use this formula on rather lengthy vectors and I wanted
to put R's efficiency to some good use. In any case, I had not come up with
your solution. For now, I'd stick to my ugly version.

> Make sense?

Perfectly.

    >x <- 1:150 * 10000
    >y <- numeric(150)
    >for (i in 1:150) y[i] <- mr(x[i])
    >identical(MyRange(x), y)
    >TRUE

I would however use max instead of pmax, since the argument for mr() must be
a vector of length 1. The final version looks like this (also added a line
to avoid vectors of length > 1):

mr <-
  local({
    # Local constants
    range= c(20,100,250,700,1000,Inf)*1000
    perc = c(65,40,30,25,20,0)/100
    min =  c(0,14,40,75,175,250)*1000

    function(x)
      {if (length(x) >1) stop("x must have length 1")
      idx <- which(x<=range)[1]
        max( x*perc[idx], min[idx] )
      }
  })

Thank you very much for your help.
Diego


Stavros Macrakis-2 wrote:
> 
> On Sun, Mar 15, 2009 at 4:12 PM, diegol <diegol81 at gmail.com> wrote:
>> ...This could be done in Excel much tidier in my opinion (especially the
>> range_aux part), element by element (cell by cell)...
> 
> If you'd do it element-by-element in Excel, why not do it
> element-by-element in R?
> 
> Create a table with the limits of the ranges
> 
>     range= c(20,100,250,700,1000,Inf)*1000
> 
> and then find the index of the appropriate case using something like
> 
>     idx <- which(x<=range)[1]
> 
> Then the formula becomes simply
> 
>     pmax( x*perc[idx], min[idx] )
> 
> Putting it all together:
> 
> mr <-
>   local({
>     # Local constants
>     range= c(20,100,250,700,1000,Inf)*1000
>     perc = c(65,40,30,25,20,0)/100
>     min =  c(0,14,40,75,175,250)*1000
> 
>     function(x)
>       { idx <- which(x<=range)[1]
>         pmax( x*perc[idx], min[idx] )
>       }
>   })
> 
> Make sense?
> 
>           -s
> 
> ______________________________________________
> 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.
> 
> 


-----
~~~~~~~~~~~~~~~~~~~~~~~~~~
Diego Mazzeo
Actuarial Science Student
Facultad de Ciencias Económicas
Universidad de Buenos Aires
Buenos Aires, Argentina
-- 
View this message in context: http://www.nabble.com/Testing-for-Inequality-%C3%A0-la-%22select-case%22-tp22527465p22529091.html
Sent from the R help mailing list archive at Nabble.com.




More information about the R-help mailing list