Pregunta

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.

¿Fue útil?

Solución

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top