[R] Is it possible to vectorize/accelerate this?

Carl Witthoft carl at witthoft.com
Thu Nov 3 23:29:22 CET 2011

I have to admit to not doing careful timing tests, but I often eliminate 
if() lines as follows (bad/good is just my preference)

BAD:  b[i] <- if(a[i]>1) a[i] else a[i-1]

GOOD:  b[i] <- a[i]* (a[i]>1) + a[i-1] * (a[i]<=1)

On Thu, Nov 3, 2011 at 12:10 PM, hihi <v.p.mail_at_freemail.hu> wrote:
 > Dear Members,
 > I work on a simulaton experiment but it has an bottleneck. It's quite 
fast because of R and vectorizing, but it has a very slow for loop. The 
adjacent element of a vector (in terms of index number) depends 
conditionally on the former value of itself. Like a simple cumulating 
function (eg. cumsum) but with condition. Let's show me an example:
 > a_vec = rnorm(100)
 > b_vec = rep(0, 100)
 > b_vec[1]=a_vec[1]
 > for (i in 2:100){b_vec[i]=ifelse(abs(b_vec[i-1]+a_vec[i])>1, 
a_vec[i], b_vec[i-1]+a_vec[i])}
 > print(b_vec)

Sent from my Cray XK6
"Pendeo-navem mei anguillae plena est."

More information about the R-help mailing list