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@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@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@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@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.