Question

I've got two columns which are as under:

a<- c(1,1,1,2,3,2,2,2,2,1,0,0,0,0,2,3,4,4,1,1)
date<- Sys.Date()-20:1
data<- xts(a,date)
colnames(data)<- "a"
data

Here we can see that there are lot of duplicate elements, ie. they are repeated ones. I want a code which can replace all the elements which are consecutive and duplicate by 0 except for the first element. The result which i require is

a<- c(1,0,0,2,3,2,0,0,0,1,0,0,0,0,2,3,4,0,1,0)

I've tried what i've learnt from my earlier post

ifelse(data$a == c(data$a[1]-1,data$a[(1:length(data$a)-1)]) , 0 , data$a)

and also i've tried

data$a<- replace(data$a, duplicated(c(0, cumsum(abs(diff(data$a))))), 0)

but both the codes are not working in xts. Though both the above mentioned code is working for normal vector.

Was it helpful?

Solution

You were on the right track with diff, but I think it's simpler than you're making it:

a[c(F, diff(a) == 0)] <- 0
a
[1] 1 0 0 2 3 2 0 0 0 1 0 0 0 0 2 3 4 0 1 0

Edit

To make this solution another column, then you can just assign it by:

data$b <- ifelse(c(F, diff(data$a)==0), 0, data$a)

Or by making a copy:

data$b <- data$a
data$b[c(F, diff(data$b) ==0)] <- 0
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top