Skip to content
Prev 1809 / 7420 Next

change values of a vector selectively

Hey,

I have a vector containing mostly zeroes. At varying positions are 
markers that mark different channels ("B", 1, 2).

 > head(exp$Marker, 100)
   [1] "B" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
"0" "0"
  [19] "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
"0" "0"
  [37] "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
"0" "0"
  [55] "0" "0" "0" "0" "0" "1" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
"0" "0"
  [73] "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
"0" "0"
  [91] "0" "0" "0" "0" "0" "0" "0" "0" "0" "0"

I would like to change all zeroes between two markers to the marker that 
came before.
E.g. everything after "B" shall be "B" until the 1. Then everything 
shall be 1 until the next "B" and so on. I hope you can imagine what I 
intend.

I tried it in a loop:

for(i in 1:length(exp$Marker)){
   if(! exp$Marker[i] %in% c("B", 1, 2))
     exp$Marker[i] <- exp$Marker[i-1]
}

but that takes forever. Can anyone point me to another solution?
E.g. identify all so far not marked elements, like this

exp$Marker[which(! exp$Marker %in% c("B", 1, 2))]

and change them to the desired values. But i cannot figure out how to 
change them selectively...

Thanks for your help!

Cheers,
Mango