Подтвердить что ты не робот

R: удалить повторяющиеся значения и сохранить первый в двоичном векторе

Я хотел бы удалить повторяющиеся, но сохранить первый в двоичном векторе:

x = c(0,0,1,1,0,1,0,1,1,1,0,1) # the input 
y = c(0,0,1,0,1,0,1,0,1)     # the desired output

i., один 1 и два 1 первого и третьего набора 1 удаляются, соответственно, и сохраняется первое в наборе.

Я пытаюсь использовать rle с cumsum, но пока не понял. Любое предложение будет оценено.

4b9b3361

Ответ 1

Использование rle/inverse.rle

res <- rle(x)
res$lengths[res$values == 1] <- 1
inverse.rle(res)
## [1] 0 0 1 0 1 0 1 0 1

Ответ 2

Мы можем использовать diff:

x[c(1, diff(x)) == 1 | x == 0]

Ответ 3

x = c(0,0,1,1,0,1,0,1,1,1,0,1)
x[!(x == 1 & #remove each value that is a 1
    c(x[-1] == 1, FALSE) #followed by a 1 (never the case for the last value)
  )]
#[1] 0 0 1 0 1 0 1 0 1

Ответ 4

x = c(0,0,1,1,0,1,0,1,1,1,0,1)
x1 <- rle(x)
x1$lengths[x1$values==1] <- 1
inverse.rle(x1)

Ответ 5

В зависимости от размера вектора вы можете прокручивать его и использовать условия для добавления значения к результату. Вот простое решение с использованием вашего ввода.

x <- c(0,0,1,1,0,1,0,1,1,1,0,1)
prev <- 0
y <- c()
for(i in x){
  if (i == 1){
    if (prev != 1){
      y <- append(y,i)
    }
  }else{
    y <- append(y,i)
  }
  prev <- i
}