If it were just one loop by itself and I was doing the calculation for just
one month for all of my 317 stations, I would agree with.  However, this
function itself is inside another loop which goes through each month and
year that I need the calculation for each of the stations.

If you have any suggestions for how I could speed up the loop that is
welcome, but I would like to try to remove it given that it is nested inside
another loop.

A

On Wed, Aug 11, 2010 at 2:59 PM, Greg Snow <Greg.Snow@imail.org> wrote:

> What is wrong with using a loop?
>
> It used to be that loops were much slower than some of the alternatives,
> but now days a well crafted loop runs almost as fast (sometime faster) than
> the apply functions.  So if the loop is working for you, use it and don't
> worry about it (though there may be ways to speed up the loop).
>
> --
> Gregory (Greg) L. Snow Ph.D.
> Statistical Data Center
> Intermountain Healthcare
> greg.snow@imail.org
> 801.408.8111
>
>
> > -----Original Message-----
> > From: r-help-bounces@r-project.org [mailto:r-help-bounces@r-
> > project.org] On Behalf Of Adrienne Wootten
> > Sent: Wednesday, August 11, 2010 10:36 AM
> > To: r-help@r-project.org
> > Subject: [R] Running something without a loop when the result from the
> > previous iteration is require for the current iteration
> >
> > Hello Everyone!
> >
> > Here's what I'm trying to do.  I'm working on generating occurrences of
> > precipitation based upon precipitation occurrence for a station during
> > the
> > previous day and two stations that have already been generated by joint
> > probablities and 1st order Markov chains or by the same generation
> > process.
> > This has to be done for each remaining stations for each month.
> >
> > > genmat # 7 stations in this example, line_before is the climatology
> > of the
> > last day of the previous month. Stations 4 and 6 have been generated
> > already
> > in this example
> >             [,1] [,2] [,3] [,4] [,5] [,6] [,7]
> > line_before    1    1    1    0    1    1    1
> >               NA   NA   NA    1   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    1   NA    0   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    1   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    0   NA    0   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    1   NA    1   NA
> >               NA   NA   NA    0   NA    0   NA
> > > num # station to generate
> > [1] 2
> > > use1 # 1st station to use in generation
> > [1] 6
> > > use2 # 2nd station to use in generation
> > [1] 4
> >
> > > genmat = event.gen2(genmat,use1,use2,num,ortho_obs_used) # Generation
> > function shown below
> > > genmat # genmat - after it has gone through station 2
> >             [,1] [,2] [,3] [,4] [,5] [,6] [,7]
> > line_before    1    1    1    0    1    1    1
> >               NA    0   NA    1   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    1   NA    0   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    1   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    0   NA    1   NA    1   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    1   NA    0   NA    1   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    0   NA    0   NA    0   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    1   NA    1   NA    1   NA
> >               NA    0   NA    0   NA    0   NA
> >
> > Where event.gen2 is this function:
> >
> > event.gen2 = function(genmat,use1,use2,num,ortho_obs_used){
> >
> > for(r in 2:nrow(genmat)){
> >
> > ran = runif(1,0,1)
> >
> > if(genmat[r,use1]==0 & genmat[r,use2]==0){
> > genmat[r,num]<-ifelse(genmat[r-
> > 1,num]==0,ifelse(ran<ortho_obs_used$Pr[1],1,0),ifelse(ran<ortho_obs_use
> > d$Pr[4],1,0))
> > }
> >
> > if(genmat[r,use1]==0 & genmat[r,use2]==1){
> > genmat[r,num]<-ifelse(genmat[r-
> > 1,num]==0,ifelse(ran<ortho_obs_used$Pr[2],1,0),ifelse(ran<ortho_obs_use
> > d$Pr[5],1,0))
> > }
> >
> > if(genmat[r,use1]==1 & genmat[r,use2]==0){
> > genmat[r,num]<-ifelse(genmat[r-
> > 1,num]==0,ifelse(ran<ortho_obs_used$Pr[3],1,0),ifelse(ran<ortho_obs_use
> > d$Pr[7],1,0))
> > }
> >
> > if(genmat[r,use1]==1 & genmat[r,use2]==1){
> > genmat[r,num]<-ifelse(genmat[r-
> > 1,num]==0,ifelse(ran<ortho_obs_used$Pr[6],1,0),ifelse(ran<ortho_obs_use
> > d$Pr[8],1,0))
> > }
> >
> > gc()
> > }
> >
> > genmat
> >
> > }
> >
> > ####
> >
> > ortho_obs_used is a data frame that contains the probablity of
> > precipitation
> > occurring on a given day for a specific set of condtions.
> > For instance ortho_obs_used$Pr[1] is the probablity of rain at station
> > s for
> > day d, given that there was no rain at station s for day d-1 and no
> > rain at
> > either of the other two stations for day d.
> >
> > The event.gen2 function handles the generation, and it runs quickly for
> > the
> > 5 remaining stations and one month, but I have to run this for 317
> > stations
> > over 48 months or more, and it becomes a really bad bottleneck.  So
> > what I'd
> > like to know is if there is anyway that I can re-write this function to
> > work
> > without a loop.  I couldn't find anything from previous posts about
> > getting
> > out of loops where the previous iteration is required to determine the
> > next
> > calculation.
> >
> > Sorry for the length of the post, but I thought it best to try to
> > explain
> > what I was doing first, before diving into my question
> >
> > Thanks in advance!
> >
> > Adrienne Wootten
> > Graduate Research Assistant/Environmental Meteorologist
> > M.S. Atmospheric Science
> > NC State University
> > State Climate Office of North Carolina
> > Raleigh, NC 27695
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > 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.
>

	[[alternative HTML version deleted]]

