Skip to content
Prev 304034 / 398506 Next

updating elements of a vector sequentially - is there a faster way?

On Fri, Aug 24, 2012 at 10:34:14AM +0200, Petr Savicky wrote:
[...]
Hi.

Let me suggest a variant of this, which can be more efficient
in some cases.

  probs <- c(.1, .3, .2, .4, .7, .9, .3, .4, .5, .6)

  p10 <- 0.6
  p00 <- 0.4

  # original code  
  vec1 <- rep(0, 10)
  for (i in 2:10) {
    vec1[i] <- ifelse(vec1[i-1] == 0,
                      ifelse(probs[i]<p10, 0, 1),
                      ifelse(probs[i]<p00, 0, 1))
  }

  # modification 
  a10 <- ifelse(probs<p10, 0, 1)
  a00 <- ifelse(probs<p00, 0, 1)
  vec2 <- ifelse(a10 == a00, a10, NA)
  vec2[1] <- 0
  while (1) {
      i <- which(is.na(vec2))
      if (length(i) == 0) break
      vec2[i] <- vec2[i-1]
  }

  all(vec1 == vec2)

  [1] TRUE

Hope this helps.

Petr Savicky.