[R] Loop problem

Jim Lemon jim at bitwrit.com.au
Thu Mar 27 11:36:11 CET 2008


Jamie Ledingham wrote:
> Dear all, I have a problem with a loop, if anyone has any knowledge on
> these things I would appreciate some comments.  The code below is
> designed to allow me to extract the top record of the data frame, and
> them remove rows from the data frame which have an index close to the
> extracted top record.
> 
> 
> topstorm<-subset(rankeddataset[1,]) ## Extracts the top storm
> topstormindex<-rankeddataset[1,1] ## Finds the top storm start index
> startindex<-topstormindex-48 ## sets the start and end indexes
> endindex<-topstorminde+48
> rankeddataset<-rankeddataset[-1,] ## Creates a new list with the top
> storm removed
> 
> ##This section of code needs looped.  It removes storms from the list
> which are too close to the extracted storm
> 
> for (i in 1:30){
> if (rankeddataset[i,1]>startindex && rankeddataset[i,1]<endindex)
> {rankeddataset<-rankeddataset[-i,]}
> }
> 
> Here is some example data:
> 
>    82856  15 / 6 / 1966   82856:82879            25.9
>    82857  15 / 6 / 1966   82857:82880            20.5
>    83036  23 / 6 / 1966   83036:83059            17.3
>    87250 15 / 12 / 1966   87250:87273            15.9
> 
Hi again Jamie,
I had a bit of time tonight and recognized your problem. I think the 
following function will do what you want, although it is probably not 
the most elegant solution. I would check it manually with a small data 
file and a small "howmany" argument to make sure that it is picking up 
the maxima you want.

find.max.rain<-function(raindata,howmany) {
  # a lazy way of getting the same structure as raindata
  # it assumes that raindata has the data structure that you want
  maxrain<-raindata[1:howmany,]
  for(i in 1:howmany) {
   # get the current number of rows
   nrows<-dim(raindata)[1]
   # find the first maximum value
   thismax<-which.max(raindata$cumrain)
   # transfer it to the return data frame
   maxrain[i,]<-raindata[thismax,]
   # calculate the minimum index for the 48 hour gap
   mindex<-thismax-48
   # make sure it is at least 1
   if(mindex < 1) mindex <- 1
   # calculate the maximum index for the gap
   maxdex<-thismax+48
   # make sure it doesn't go past the end of the data frame
   if(maxdex > nrows) maxdex<-nrows
   # chop out that time period
   raindata<-raindata[-(mindex:maxdex),]
  }
  return(maxrain)
}

Jim



More information about the R-help mailing list