On Fri, Aug 24, 2012 at 10:34:14AM +0200, Petr Savicky wrote: > On Thu, Aug 23, 2012 at 09:49:33PM -0700, Gopi Goteti wrote: > > I would like to know whether there is a faster way to do the below > > operation (updating vec1). > > > > My objective is to update the elements of a vector (vec1), where a > > particular element i is dependent on the previous one. I need to do this on > > vectors that are 1 million or longer and need to repeat that process > > several hundred times. The for loop works but is slow. If there is a faster > > way, please let me know. > > > > probs <- c(.1, .3, .2, .4, .7, .9, .3, .4, .5, .6) > > p10 <- 0.6 > > p00 <- 0.4 > > 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)) > > } > > Hi. > > If p10 is always more than p00, then try the following. [...] > # modification > a10 <- ifelse(probs<p10, 0, 1) > a00 <- ifelse(probs<p00, 0, 1) > vec2 <- ifelse(a10 == a00, a10, NA) > vec2[1] <- 0 > n <- length(vec2) > while (any(is.na(vec2))) { > shift <- c(NA, vec2[-n]) > vec2 <- ifelse(is.na(vec2), shift, vec2) > }
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. ______________________________________________ R-help@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.