[R] ?max (so far...)

Duncan Murdoch murdoch at stats.uwo.ca
Wed Jul 1 18:39:13 CEST 2009


On 01/07/2009 11:49 AM, Mark Knecht wrote:
> Hi,
>    I have a data.frame that is date ordered by row number - earliest
> date first and most current last. I want to create a couple of new
> columns that show the max and min values from other columns *so far* -
> not for the whole data.frame.
> 
>    It seems this sort of question is really coming from my lack of
> understanding about how R intends me to limit myself to portions of a
> data.frame. I get the impression from the help files that the generic
> way is that if I'm on the 500th row of a 1000 row data.frame and want
> to limit the search max does to rows 1:500  I should use something
> like [1:row] but it's not working inside my function. The idea works
> outside the function, in the sense I can create tempt1[1:7] and the
> max function returns what I expect. How do I do this with row?
> 
>    Simple example attached. hp should be 'highest p', ll should be
> 'lowest l'. I get an error message "Error in 1:row : NA/NaN argument"
> 
> Thanks,
> Mark
> 
> AddCols = function (MyFrame) {
> 	MyFrame$p<-0
> 	MyFrame$l<-0
> 	MyFrame$pc<-0
> 	MyFrame$lc<-0
> 	MyFrame$pwin<-0
> 	MyFrame$hp<-0
> 	MyFrame$ll<-0
> 	return(MyFrame)
> }
> 
> BinPosNeg = function (MyFrame) {
> 
> ## Positive y in p column, negative y in l column
> 	pos <- MyFrame$y > 0
> 	MyFrame$p[pos] <- MyFrame$y[pos]
> 	MyFrame$l[!pos] <- MyFrame$y[!pos]
> 	return(MyFrame)
> }
> 
> RunningCount = function (MyFrame) {
> ## Running count of p & l events
> 
> 	pos <- (MyFrame$p > 0)
> 	MyFrame$pc <- cumsum(pos)
> 	pos <- (MyFrame$l < 0)
> 	MyFrame$lc <- cumsum(pos)
> 
> 	return(MyFrame)
> }
> 
> PercentWins = function (MyFrame) {
> 	
> 	MyFrame$pwin <- round((MyFrame$pc / (MyFrame$pc+MyFrame$lc)),2)
> 
> 	return(MyFrame)
> }
> 
> HighLow = function (MyFrame) {
> 	temp1 <- MyFrame$p[1:row]
> 	MyFrame$hp <- max(temp1) ## Highest p
> 	temp1 <- MyFrame$l[1:row]
> 	MyFrame$ll <- min(temp1) ## Lowest l
> 
> 	return(MyFrame)
> }

You get an error in this function because you didn't define row, so R 
assumes you mean the function in the base package, and 1:row doesn't 
make sense.

What you want for the "highest so far" is the cummax (for "cumulative 
maximum") function.  See ?cummax.

Duncan Murdoch

> 
> F1 <- data.frame(x=1:10, y=2*(-4:5) )
> F1 <- AddCols(F1)
> F1 <- BinPosNeg(F1)
> F1 <- RunningCount(F1)
> F1 <- PercentWins(F1)
> F1
> F1 <- HighLow(F1)
> F1
> 
> temp1<-F1$p[1:5]
> max(temp1)
> temp1<-F1$p[1:7]
> max(temp1)
> temp1<-F1$p[1:10]
> max(temp1)
> 
> ______________________________________________
> 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.




More information about the R-help mailing list