2013-08-08 2 views
3

Я получил две колонки, которые в соответствии с:Определить и заменить дубликат из вектора столбца

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 

Здесь мы можем видеть, что есть много повторяющихся элементов, то есть. они повторяются. Я хочу код, который может заменить все элементы, которые являются последовательными и дублируются на 0, за исключением первого элемента. Результат, который я требую

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

Я попробовал то, что я узнал от моего предыдущего поста

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

, а также я попытался

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

но оба коды не работают в xts. Хотя оба вышеуказанных кода работают для нормального вектора.

+0

Да, это тот же вопрос, но это было для вектора, и здесь мне нужно это для xts. –

+4

Итак, научитесь использовать данные в разных структурах данных. Вы задаете тот же вопрос. –

+0

ОК, я постараюсь сделать это. –

ответ

4

Вы были на правильном пути с diff, но я думаю, что это проще, чем вы делаете это:

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 

Редактировать

Для того, чтобы это решение другой колонки, то вы можете просто присвоить его:

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

Или, сделав копию:

data$b <- data$a 
data$b[c(F, diff(data$b) ==0)] <- 0 
+0

Что делать, если я требую этого решения в качестве другого столбца в моих данных, говорящих данными $ b. то есть. я хочу, чтобы мой a был таким же, и другой столбец b дал бы мне это решение. –

+0

Я пробовал то же самое, но im get Error in error (x, ...): Неправильная длина одного или нескольких аргументов merge.xts –

+2

Это потому, что объекты 'xts' принуждают первый объект в' diff' to ' NA'. Поэтому используйте 'diff (data $ b, na.pad = F)', чтобы изменить это. –

Смежные вопросы