[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