Debruicker, Paul Andrew
2003-Aug-05 18:28 UTC
[R] code speed help? -- example and results provided
I have the following piece of code that combines lists comprised of components of varying length into a list with components of constant length. I have found 2 ways to do it, and the faster of the two is posted below along with sample results. Do you have any suggestions on how to decrease the calculation time by modifying the code?> ####Function########### > replacement2.idx<-function(life=w.life,N=years,n=samples){+ + yrs<-rep(N,n) + ind<-yrs-life + + x1<-mapply(rep,times=life,x=0) + x2<-mapply(rep,times=ind,x=1) + + x3<-data.frame(c(x1[[1]],x2[[1]])) + + for(i in 2:n) x3<-data.frame(x3, append(x1[[i]],x2[[i]])) + + x3<-t(x3) + }> > > > ###Sample Output### > samples<-5 > years<-10 > w.life<-round(rnorm(samples,5,1),digits=0) > > system.time(abc<-replacement2.idx())[1] 0.04 0.00 0.07 0.00 0.00> > abc1 2 3 4 5 6 7 8 9 10 c.x1..1....x2..1... 0 0 0 0 0 0 1 1 1 1 append.x1..i....x2..i... 0 0 0 0 0 0 1 1 1 1 append.x1..i....x2..i... 0 0 0 0 0 0 1 1 1 1 append.x1..i....x2..i... 0 0 0 0 1 1 1 1 1 1 append.x1..i....x2..i... 0 0 0 0 0 1 1 1 1 1> > > > ###1000 samples#### > samples<-1000 > w.life<-round(rnorm(samples,5,.5),digits=0) > system.time(method2<-replacement2.idx())[1] 12.79 0.00 14.04 0.00 0.00> > > > ###5000 samples#### > samples<-5000 > w.life<-round(rnorm(samples,5,.5),digits=0) > system.time(method2<-replacement2.idx())[1] 544.82 0.00 593.98 0.00 0.00>
It doesn't seem that you need data frame to do this since x1 and x2 are always numeric. I think your final data frame object has N rows. This should be much faster. n <- 5 N <- 10 life <- c(3,2,7,8,10) ind <- N-life matrix(rep(rep(0:1,n),c(rbind(life,ind))),ncol=N,byrow=T) BTW, it would have been easier to help if you had put your executable example ready to "cut and paste". All the ">" and "+" make it tedious to reproduce your example. HTH, Jerome On August 5, 2003 11:28 am, Debruicker, Paul Andrew wrote:> I have the following piece of code that combines lists comprised of > components of varying length into a list with components of constant > length. I have found 2 ways to do it, and the faster of the two is > posted below along with sample results. Do you have any suggestions on > how to decrease the calculation time by modifying the code? > > > ####Function########### > > replacement2.idx<-function(life=w.life,N=years,n=samples){ > > + > + yrs<-rep(N,n) > + ind<-yrs-life > + > + x1<-mapply(rep,times=life,x=0) > + x2<-mapply(rep,times=ind,x=1) > + > + x3<-data.frame(c(x1[[1]],x2[[1]])) > + > + for(i in 2:n) x3<-data.frame(x3, append(x1[[i]],x2[[i]])) > + > + x3<-t(x3) > + } > > > ###Sample Output### > > samples<-5 > > years<-10 > > w.life<-round(rnorm(samples,5,1),digits=0) > > > > system.time(abc<-replacement2.idx()) > > [1] 0.04 0.00 0.07 0.00 0.00 > > > abc > > 1 2 3 4 5 6 7 8 9 10 > c.x1..1....x2..1... 0 0 0 0 0 0 1 1 1 1 > append.x1..i....x2..i... 0 0 0 0 0 0 1 1 1 1 > append.x1..i....x2..i... 0 0 0 0 0 0 1 1 1 1 > append.x1..i....x2..i... 0 0 0 0 1 1 1 1 1 1 > append.x1..i....x2..i... 0 0 0 0 0 1 1 1 1 1 > > > ###1000 samples#### > > samples<-1000 > > w.life<-round(rnorm(samples,5,.5),digits=0) > > system.time(method2<-replacement2.idx()) > > [1] 12.79 0.00 14.04 0.00 0.00 > > > ###5000 samples#### > > samples<-5000 > > w.life<-round(rnorm(samples,5,.5),digits=0) > > system.time(method2<-replacement2.idx()) > > [1] 544.82 0.00 593.98 0.00 0.00 > > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo/r-help