Galen Moore
2011-Apr-25 22:29 UTC
[R] Trouble Passing a for loop variable (iteration #) to a data frame
Greetings - I am working on a piece of code to simulate vehicle times in and out in each of a number of parking spaces. At this stage, my code basically does what it is supposed to do but for the sequential number of each new parking event for a given space (i.e., the index of the loop variable). Instead of passing the index of the loop variable (iter) to the data frame, it passes the value of the total number of iterations. Eventually, the number of iterations (parking events in a given space) will be determined by an rnorm() fcn, so I am not looking for a process that locks-in the number of iterations. The total eventual data set size is small-ish, so I'm not worried about speed. I'm sure my problem lies somehow in my setup of the data frames and my rbind() fcns, but a great many attempts and several hours of searching online have not yet brought success. Can you please suggest what I need to do to get the iteration # to appear in the "iter" vector and therefore to the data frame? Many thanks, Galen> # fabdata3.r> # fabricate sample data>> #declare the mean duration> dur<-.04>> #declare the stdDev of the rnorm() fcn (duration)> varc<-.01>> sp<-numeric()> iter<-numeric()> ti<-numeric()> to<-numeric()> actdur<-numeric()> #newline<-data.frame(sp, iter, ti, to, actdur)> ds<-data.frame(sp, iter, ti, to, actdur)>> # BEGIN OUTER LOOP> for (sp in c(1:3)) {+ + ct<-1 + # BEGIN INNER LOOP + + x <- seq(1, 4, by=1) + for (i in seq(along=x)) { + + if (i == 1) { + ti[1]<-((.333333+rnorm(1, dur, varc))) + to[1]<-((ti[1]+rnorm(1, dur, varc))) + actdur[1]<-(to[1]-ti[1]) + iter<-x[1] + + } + + else { + # set subsequent time-ins to prev to + a rand# + ti[i]<-((to[i-1]+rnorm(1, dur, varc))) + # calculate each event's time-out + to[i]<-((ti[i]+rnorm(1, dur, varc))) + # calculate each event's actual duration + actdur[i]<-(to[i]-ti[i]) + iter<-x[i] + + } + spStep<-paste("sp Value is ", sp) + print(spStep) + iterStep<-paste("iter Value is ", iter) + print(iterStep) + + newrow<-data.frame(sp, iter, ti, to, actdur) + ct=ct+1 + } #END INNER LOOP + ds<-rbind(ds, newrow) + } [1] "sp Value is 1" [1] "iter Value is 1" [1] "sp Value is 1" [1] "iter Value is 2" [1] "sp Value is 1" [1] "iter Value is 3" [1] "sp Value is 1" [1] "iter Value is 4" [1] "sp Value is 2" [1] "iter Value is 1" [1] "sp Value is 2" [1] "iter Value is 2" [1] "sp Value is 2" [1] "iter Value is 3" [1] "sp Value is 2" [1] "iter Value is 4" [1] "sp Value is 3" [1] "iter Value is 1" [1] "sp Value is 3" [1] "iter Value is 2" [1] "sp Value is 3" [1] "iter Value is 3" [1] "sp Value is 3" [1] "iter Value is 4"> print(ds)sp iter ti to actdur 1 1 4 0.3600055 0.4123550 0.05234955 2 1 4 0.4343887 0.4640804 0.02969170 3 1 4 0.5240268 0.5622272 0.03820032 4 1 4 0.5945877 0.6436489 0.04906118 5 2 4 0.3694827 0.4166405 0.04715775 6 2 4 0.4609841 0.4968517 0.03586767 7 2 4 0.5357721 0.5735439 0.03777185 8 2 4 0.6207077 0.6512799 0.03057217 9 3 4 0.3801887 0.4122605 0.03207179 10 3 4 0.4440002 0.4916171 0.04761685 11 3 4 0.5380228 0.5791549 0.04113214 12 3 4 0.6087923 0.6291451 0.02035284> # END OUTER LOOP>[[alternative HTML version deleted]]
Peter Langfelder
2011-Apr-25 23:07 UTC
[R] Trouble Passing a for loop variable (iteration #) to a data frame
You need to index the variable iter: instead of iter = x[i], say iter[i] = x[i]. But a better solution is to simply say iter = x at the beginning and don't update it in the loop. The way your code is written, iter just holds the last x[i], and the last x[i] at the end of each loop is 4. Peter On Mon, Apr 25, 2011 at 3:29 PM, Galen Moore <galen.a.moore at gmail.com> wrote:> Greetings - > > > > I am working on a piece of code to simulate vehicle times in and out in each > of a number of parking spaces. ?At this stage, my code basically does what > it is supposed to do but for the sequential number of each new parking event > for a given space (i.e., the index of the loop variable). ?Instead of > passing the index of the loop variable (iter) to the data frame, it passes > the value of the total number of iterations. ?Eventually, the number of > iterations (parking events in a given space) will be determined by an > rnorm() fcn, so I am not looking for a process that locks-in the number of > iterations. ?The total eventual data set size is small-ish, so I'm not > worried about speed. > > > > I'm sure my problem lies somehow in my setup of the data frames and my > rbind() fcns, but a great many attempts and several hours of searching > online have not yet brought success. > > > > Can you please suggest what I need to do to get the iteration # to appear in > the "iter" vector and therefore to the data frame? > > > > Many thanks, > > > > Galen > > > > > >> # fabdata3.r > >> # fabricate sample data > >> > >> #declare the mean duration > >> dur<-.04 > >> > >> #declare the stdDev of the rnorm() fcn (duration) > >> varc<-.01 > >> > >> sp<-numeric() > >> iter<-numeric() > >> ti<-numeric() > >> to<-numeric() > >> actdur<-numeric() > >> #newline<-data.frame(sp, iter, ti, to, actdur) > >> ds<-data.frame(sp, iter, ti, to, actdur) > >> > >> # BEGIN OUTER LOOP > >> for (sp in c(1:3)) { > > + > > + ? ? ? ? ? ?ct<-1 > > + ? ? ? ? ? ?# BEGIN INNER LOOP > > + > > + ? ? ? ? ? ?x <- seq(1, 4, by=1) > > + ? ? ? ? ? ?for (i in seq(along=x)) { > > + > > + ? ? ? ? ? ? ? ? ? ? ? ? if (i == 1) ? { > > + ? ? ? ? ? ? ? ? ? ? ? ? ?ti[1]<-((.333333+rnorm(1, dur, varc))) > > + ? ? ? ? ? ? ? ? ? ? ? ? ?to[1]<-((ti[1]+rnorm(1, dur, varc))) > > + ? ? ? ? ? ? ? ? ? ? ? ? ?actdur[1]<-(to[1]-ti[1]) > > + ? ? ? ? ? ? ? ? ? ? ? ? ?iter<-x[1] > > + > > + ? ? ? ? ? ? ? ? ? ? ? ? ?} > > + > > + ? ? ? ? ? ? ? ? ? ? ? ? else { > > + ? ? ? ? ? ? ? ? ? ? ? ? # set subsequent time-ins to prev to + a rand# > > + ? ? ? ? ? ? ? ? ? ? ? ? ti[i]<-((to[i-1]+rnorm(1, dur, varc))) > > + ? ? ? ? ? ? ? ? ? ? ? ? # calculate each event's time-out > > + ? ? ? ? ? ? ? ? ? ? ? ? to[i]<-((ti[i]+rnorm(1, dur, varc))) > > + ? ? ? ? ? ? ? ? ? ? ? ? # calculate each event's actual duration > > + ? ? ? ? ? ? ? ? ? ? ? ? actdur[i]<-(to[i]-ti[i]) > > + ? ? ? ? ? ? ? ? ? ? ? ? iter<-x[i] > > + > > + ? ? ? ? ? ? ? ? ? ? ? ? } > > + ? ? ? ? ? ? ? ? ? ? ? ? ?spStep<-paste("sp Value is ", sp) > > + ? ? ? ? ? ? ? ? ? ? ? ? ?print(spStep) > > + ? ? ? ? ? ? ? ? ? ? ? ? ?iterStep<-paste("iter Value is ", iter) > > + ? ? ? ? ? ? ? ? ? ? ? ? ?print(iterStep) > > + > > + ? ? ? ? ? ? ? ? ? ? ? ? newrow<-data.frame(sp, iter, ti, to, actdur) > > + ? ? ? ? ? ? ? ? ? ? ? ? ct=ct+1 > > + ? ? ? ? ? ? ? ? ?} ?#END INNER LOOP > > + ? ? ? ? ? ? ? ? ?ds<-rbind(ds, newrow) > > + ? ? ? ? ? ? } > > [1] "sp Value is ?1" > > [1] "iter Value is ?1" > > [1] "sp Value is ?1" > > [1] "iter Value is ?2" > > [1] "sp Value is ?1" > > [1] "iter Value is ?3" > > [1] "sp Value is ?1" > > [1] "iter Value is ?4" > > [1] "sp Value is ?2" > > [1] "iter Value is ?1" > > [1] "sp Value is ?2" > > [1] "iter Value is ?2" > > [1] "sp Value is ?2" > > [1] "iter Value is ?3" > > [1] "sp Value is ?2" > > [1] "iter Value is ?4" > > [1] "sp Value is ?3" > > [1] "iter Value is ?1" > > [1] "sp Value is ?3" > > [1] "iter Value is ?2" > > [1] "sp Value is ?3" > > [1] "iter Value is ?3" > > [1] "sp Value is ?3" > > [1] "iter Value is ?4" > >> ? ? ? ? ? ? print(ds) > > ? sp iter ? ? ? ?ti ? ? ? ?to ? ? actdur > > 1 ? 1 ? ?4 0.3600055 0.4123550 0.05234955 > > 2 ? 1 ? ?4 0.4343887 0.4640804 0.02969170 > > 3 ? 1 ? ?4 0.5240268 0.5622272 0.03820032 > > 4 ? 1 ? ?4 0.5945877 0.6436489 0.04906118 > > 5 ? 2 ? ?4 0.3694827 0.4166405 0.04715775 > > 6 ? 2 ? ?4 0.4609841 0.4968517 0.03586767 > > 7 ? 2 ? ?4 0.5357721 0.5735439 0.03777185 > > 8 ? 2 ? ?4 0.6207077 0.6512799 0.03057217 > > 9 ? 3 ? ?4 0.3801887 0.4122605 0.03207179 > > 10 ?3 ? ?4 0.4440002 0.4916171 0.04761685 > > 11 ?3 ? ?4 0.5380228 0.5791549 0.04113214 > > 12 ?3 ? ?4 0.6087923 0.6291451 0.02035284 > >> # END OUTER LOOP > >> > > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > 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. >