Domanda

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.

È stato utile?

Soluzione

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top