[R] Testing for Inequality à la "select case"
diegol
diegol81 at gmail.com
Mon Mar 16 00:19:03 CET 2009
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.
More information about the R-help
mailing list