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

baptiste auguie ba208 at exeter.ac.uk
Mon Mar 16 00:43:17 CET 2009


Hi,

I don't use ?cut and ?split very much either, so this may not be good  
advice. From what I understood of your problem, I would try something  
along those lines,

> 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
>
> range = c(0, range)
>
> x <- 1:150 * 10000
> percent <- x
> minimum <- x
>
> z <- cut(x = x, breaks = range)
> levs <- levels(z)
>
>
> split(percent, z, drop = FALSE) <- perc
> split(minimum, z, drop = FALSE) <- min
>
> mydf <- data.frame(x, range= z, percent, minimum)
>
> mydf <- within(mydf, product  <-  x * percent)
>
> mydf$result <- with(mydf, ifelse(product < minimum, minimum, product))
>
> str(mydf)
> head(mydf)

but it's getting late here so i may well be missing an important thing.

Hope this helps,

baptiste

On 15 Mar 2009, at 23:19, diegol wrote:

>
> Hello Baptiste,
>
> I am not very sure how I'd go about that. Taking the range, perc and  
> min
> vectors from Stavros' response:
>
>    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
>
> For range to work as the breaks argument to "cut", I think an  
> additional
> first element is needed:
>
>    range = c(0, range)
>
> Now I create a dummy vector x and apply cut to create a factor z:
>
>    x <- 1:150 * 10000
>    z <- cut(x = x, breaks = range)
>
> The thing is, I cannot seem to figure out how to use this z factor  
> to create
> vectors of the same length as x with the corresponding elements of  
> "percent"
> and "min" defined above. Admittedly I have never felt very  
> comfortable with
> factors. Could you please give me some advice?
>
> Thank you very much.
>
>
>
> baptiste auguie-2 wrote:
>>
>> Hi,
>>
>> I think you could get a cleaner solution using ?cut to split your  
>> data
>> in given ranges (the break argument), and then using this factor to
>> give the appropriate percentage.
>>
>>
>> Hope this helps,
>>
>> baptiste
>>
>> On 15 Mar 2009, at 20:12, diegol wrote:
>>
>>>
>>> Using R 2.7.0 under WinXP.
>>>
>>> I need to write a function that takes a non-negative vector and
>>> returns the
>>> parallell maximum between a percentage of this argument and a fixed
>>> value.
>>> Both the percentages and the fixed values depend on which interval x
>>> falls
>>> in. Intervals are as follows:
>>>
>>>> From      |       To         |       % of x   |       Minimum
>>> ---------------------------------------------------------------
>>> 0           |       20000    |       65        |       0
>>> 20000     |       100000  |       40        |       14000	
>>> 100000   |       250000   |       30       |       40000	
>>> 250000   |       700000   |       25       |       75000
>>> 700000   |       1000000 |       20       |       175000
>>> 1000000 |       inf          |       --       |       250000
>>>
>>> Once the interval is determined, the values in x are multiplied by  
>>> the
>>> percentages applying to the range in the 3rd column.
>>> If the result is less than the fourth column, then the latter is  
>>> used.
>>> For values of x falling in the last interval, 250,000 must be used.
>>>
>>>
>>> My best attempt at it in R:
>>>
>>> 	MyRange <- function(x){
>>>
>>> 	range_aux = ifelse(x<=20000, 1,
>>>       	    ifelse(x<=100000, 2,
>>> 	              ifelse(x<=250000, 3,
>>>       	        ifelse(x<=700000, 4,
>>>               	  ifelse(x<=1000000, 5,6)))))
>>> 	percent = c(0.65, 0.4, 0.3, 0.25, 0.2, 0)
>>> 	minimum = c(0, 14000, 40000, 75000, 175000, 250000)
>>>
>>> 	pmax(x * percent[range_aux], minimum[range_aux])
>>>
>>> 	}
>>>
>>>
>>> This could be done in Excel much tidier in my opinion (especially  
>>> the
>>> range_aux part), element by element (cell by cell),
>>>
>>> with a VBA function as follows:
>>>
>>> 	Function MyRange(x as Double) as Double
>>>
>>> 	Select Case x
>>> 	    Case Is <= 20000
>>>       	MyRange = 0.65 * x
>>> 	    Case Is <= 100000
>>> 	        RCJuiProfDet = IIf(0.40 * x < 14000, 14000, 0.4 * x)
>>> 	    Case Is <= 250000
>>> 	        RCJuiProfDet = IIf(0.3 * x < 40000, 40000, 0.3 * x)
>>> 	    Case Is <= 700000
>>> 	        RCJuiProfDet = IIf(0.25 * x < 75000, 75000, 0.25 * x)
>>> 	    Case Is <= 1000000
>>> 	        RCJuiProfDet = IIf(0.2 * x < 175000, 175000, 0.2 * x)
>>> 	    Case Else
>>> 		' This is always 250000. I left it this way so it is analogous to
>>> the R
>>> function
>>> 	        RCJuiProfDet = IIf(0 * x < 250000, 250000, 0 * x)
>>> 	End Select
>>>
>>> 	End Function
>>>
>>>
>>> Any way to improve my R function? I have searched the help archive
>>> and the
>>> closest I have found is the switch function, which tests for
>>> equality only.
>>> Thank you in advance for reading this.
>>>
>>>
>>> -----
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> 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-tp22527465p22527465.html
>>> Sent from the R help mailing list archive at Nabble.com.
>>>
>>> ______________________________________________
>>> 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.
>>
>> _____________________________
>>
>> Baptiste Auguié
>>
>> School of Physics
>> University of Exeter
>> Stocker Road,
>> Exeter, Devon,
>> EX4 4QL, UK
>>
>> Phone: +44 1392 264187
>>
>> http://newton.ex.ac.uk/research/emag
>>
>> ______________________________________________
>> 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-tp22527465p22529553.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> 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.

_____________________________

Baptiste Auguié

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag




More information about the R-help mailing list