[R] How to eliminate this for loop ?

Greg Snow Greg.Snow at imail.org
Mon Nov 8 21:15:00 CET 2010


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
> PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list