# [R] How to eliminate this for loop ?

William Dunlap wdunlap at tibco.com
Tue Nov 9 18:07:14 CET 2010

Note that for long vectors the OP's code would
go much faster if he preallocated the output vector
a <- numeric(N)
a <- c()
I defined 2 functions that differed only in how
a was initialized
f0 <- function(b, c) {
N <- length(c)
a <- c()
a[1] <- 1; # initial value
for(i in 2:N) {
a[i]<-a[i-1]*b - c[i-1] # b is a value, c is another vector
}
a
}

f1 <- function(b, c) {
N <- length(c)
a<- numeric(N)
a[1] <- 1; # initial value
for(i in 2:N) {
a[i]<-a[i-1]*b - c[i-1] # b is a value, c is another vector
}
a
}
and timed them for a 100,000 long vector:
> c <- rnorm(1e5)
> system.time(a0 <- f0(b=0.5, c=c))
user  system elapsed
17.270   1.410  18.704
> system.time(a1 <- f1(b=0.5, c=c))
user  system elapsed
0.400   0.000   0.401
> identical(a0, a1)
[1] TRUE
If that is not fast enough then you have to
start thinking harder.  E.g., look at functions
like filter() and/or do some algebra.

(Greg's code also had an error of that sort,
preallocating 100 entries where the eventual
length was 1000).

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

> -----Original Message-----
> From: r-help-bounces at r-project.org
> [mailto:r-help-bounces at r-project.org] On Behalf Of Greg Snow
> Sent: Tuesday, November 09, 2010 8:31 AM
> To: Greg Snow; PLucas; r-help at r-project.org
> Subject: Re: [R] How to eliminate this for loop ?
>
> works if you multiply cc by -1 (except the initial 1).
>
> --
> Gregory (Greg) L. Snow Ph.D.
> Statistical Data Center
> Intermountain Healthcare
> greg.snow at imail.org
> 801.408.8111
>
>
> > -----Original Message-----
> > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> > project.org] On Behalf Of Greg Snow
> > Sent: Monday, November 08, 2010 1:15 PM
> > To: PLucas; r-help at r-project.org
> > Subject: Re: [R] How to eliminate this for loop ?
> >
> > If you are willing to shift the c vector by 1 and have 1
> (the initial
> > value) as the start of c, then you can just do:
> >
> > cumsum( cc * b^( (n-1):0 ) ) / b^( (n-1):0 )
> >
> > to compare:
> >
> > cc <- c(1, rnorm(999) )
> > b <- 0.5
> > n <- length(cc)
> >
> > a1 <- numeric(100)
> > a1[1] <- 1
> >
> > system.time(for(i in 2:n ) {
> > 	a1[i] <- b*a1[i-1] + cc[i]
> > })
> >
> > system.time(a2 <- cumsum( cc * b^( (n-1):0 ) ) / b^( (n-1):0 ))
> >
> > all.equal(a1,a2)
> >
> > Though you could have problems with the b^ part if the
> length gets too
> > long.
> >
> > --
> > Gregory (Greg) L. Snow Ph.D.
> > Statistical Data Center
> > Intermountain Healthcare
> > greg.snow at imail.org
> > 801.408.8111
> >
> >
> > > -----Original Message-----
> > > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> > > project.org] On Behalf Of PLucas
> > > Sent: Monday, November 08, 2010 2:26 AM
> > > To: r-help at r-project.org
> > > Subject: [R] How to eliminate this for loop ?
> > >
> > >
> > > Hi, I would like to create a list recursively and eliminate my for
> > loop
> > > :
> > >
> > > a<-c()
> > > a[1] <- 1; # initial value
> > > for(i in 2:N) {
> > > 	a[i]<-a[i-1]*b - c[i-1] # b is a value, c is another vector
> > > }
> > >
> > >
> > > Is it possible ?
> > >
> > > Thanks
> > > --
> > > View this message in context:
> http://r.789695.n4.nabble.com/How-to-
> > > eliminate-this-for-loop-tp3031667p3031667.html
> > > Sent from the R help mailing list archive at Nabble.com.
> > >
> > > ______________________________________________
> > > R-help at r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-help
> > > guide.html
> > > and provide commented, minimal, self-contained, reproducible code.
> >
> > ______________________________________________
> > R-help at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > guide.html
> > and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help