I have a string of binary values, and I would like to flip certain bits in a set of positions. Let's say the vector p contains position [1, 3, 5, 7] vector b contains bits [1, 0, 1, 0, 1, 0, 1, 0, 1, 0] result r should be [0, 1, 0, 0, 0, 0, 0, 0, 1, 0] in pseudo code this would be something like --- r = c() for (i in 1:10) if (i in p) r = c(r, flip[i]) r ---- doesn't work :-) R doesn't like the if statement. Is there a nice, concise way to do this? The vector contents and size will vary, but length of p <= b. Thanks, Esmail
I do not think your wetware processed the inputs correctly. The second bit should not have been flipped: Try this loop free index based solution: b <- c( 1, 0, 1, 0, 1, 0, 1, 0, 1, 0) r <- b r[p] <- 0 + !r[p] # adding 0 converts logical TRUE/FALSE to 0/1 r [1] 0 0 0 0 0 0 0 0 1 0 The "if" statement is for control but you might have succeeded with an ifelse function which is generally more useful for conditional modification of vectors. It could have been used if the transformation were not binary. -- David Winsemius On Apr 19, 2009, at 3:24 PM, Esmail wrote:> I have a string of binary values, and I would like to flip certain > bits in a set of positions. > > Let's say the > > vector p contains position [1, 3, 5, 7] > vector b contains bits [1, 0, 1, 0, 1, 0, 1, 0, 1, 0] > result r should be [0, 1, 0, 0, 0, 0, 0, 0, 1, 0] > > in pseudo code this would be something like > > --- > > r = c() > > for (i in 1:10) > if (i in p) > r = c(r, flip[i]) > > r > ---- > > doesn't work :-) R doesn't like the if statement. > > Is there a nice, concise way to do this? The vector contents and > size will vary, but length of p <= b. > > Thanks, > Esmail
try this:> b <- c(1, 0, 1, 0, 1, 0, 1, 0, 1, 0) > p <- c(1, 3, 5, 7) > b[p] <- ifelse(b[p] == 0, 1, 0) > b[1] 0 0 0 0 0 0 0 0 1 0 On Sun, Apr 19, 2009 at 3:24 PM, Esmail <esmail.js at gmail.com> wrote:> I have a string of binary values, and I would like to flip certain > bits in a set of positions. > > Let's say the > > vector p contains position [1, 3, 5, 7] > vector b contains bits ? [1, 0, 1, 0, 1, 0, 1, 0, 1, 0] > result r should be ? ? ? [0, 1, 0, 0, 0, 0, 0, 0, 1, 0] > > in pseudo code this would be something like > > --- > > r = c() > > for (i in 1:10) > ?if (i in p) > ? ? r = c(r, flip[i]) > > r > ---- > > doesn't work :-) ?R doesn't like the if statement. > > Is there a nice, concise way to do this? The vector contents and > size will vary, but length of p <= b. > > Thanks, > Esmail > > ______________________________________________ > 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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve?
David Winsemius wrote:> I do not think your wetware processed the inputs correctly. The second > bit should not have been flipped:Ooops .. yes you are right!> > Try this loop free index based solution: > > b <- c( 1, 0, 1, 0, 1, 0, 1, 0, 1, 0) > r <- b > r[p] <- 0 + !r[p] # adding 0 converts logical TRUE/FALSE to 0/1 > r > [1] 0 0 0 0 0 0 0 0 1 0Great! .. thanks ... I appreciate the hlep, Esmail