How about for (ir in unique(df$TreeID)) { in.ir <- df$TreeID == ir df$HeightGrowth[in.ir] <- cumsum(df$Height[in.ir]) }
Seemed fast enough to me. In R, it is generally good to look for ways to operate on entire vectors or arrays, rather than element by element within them. The cumsum() function does that in this example. -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 On 6/10/13 10:28 AM, "Trevor Walker" <trevordaviswal...@gmail.com> wrote: >I have a For loop that is quite slow and am wondering if there is a faster >option: > >df <- data.frame(TreeID=rep(1:500,each=20), Age=rep(seq(1,20,1),500)) >df$Height <- exp(-0.1 + 0.2*df$Age) >df$HeightGrowth <- NA #intialize with NA >for (i in 2:nrow(df)) > {if(df$TreeID[i]==df$TreeID[i-1]) > {df$HeightGrowth[i] <- df$Height[i]-df$Height[i-1] > } > } > >Trevor Walker >Email: trevordaviswal...@gmail.com > > [[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. ______________________________________________ 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.