[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