как в R заменить дубликаты

Подскажите пожалуйста как заменить дубликаты, которые при смене с 1 на -1 или с -1 на 1 повторяющийся заменить на (NA)

mas = c(1 , 1 , 1 , 1,  1, -1, -1, -1, -1, -1, -1 ,-1 ,-1 ,-1 ,-1 ,-1, -1, -1,  1,  1,  1,  1, -1, -1)
mas
[1]  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1

duplicated(mas ) # не помогает


вот что должно получиться
[1]  1 NA NA NA NA -1 NA NA NA NA NA NA NA NA NA NA NA NA  1 NA NA NA -1 NA

Пробую вот таким способом, не получается.

mas = c(1 , 1 , 1 , 1,  1, -1, -1, -1, -1, -1, -1 ,-1 ,-1 ,-1 ,-1 ,-1, -1, -1,  1,  1,  1,  1, -1, -1)
mas
[1]  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1

# вот такой способ, но пропускает первое число и выводит TRUE либо FALSE, а в целом работает. 
dt = data.table(mas)

dt2 = dt$mas[-1] != dt$mas[-nrow(dt)]
dt2
[1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE


а вот что должно получиться
[1]  1 NA NA NA NA -1 NA NA NA NA NA NA NA NA NA NA NA NA  1 NA NA NA -1 NA

Ответы (1 шт):

Автор решения: Artem Klevtsov

Если в качестве решения используется сравнение элемента вектора с его предыдущим элементом, то в качестве реализации можно применить функцию shift из пакета data.table:

library(data.table)
idx <- fcoalesce(mas == shift(mas), FALSE)
mas[idx] <- NA

fcoalesce здесь заменяет NA, которое образуется при сравнении первого элемента вектора с предыдущего (которого нет).

Также можно отследить начало новой серии (одинаковых значений) с помощью функции rle:

idx <- cumsum(c(1, rle(mas)$lengths))
mas[-idx] <- NA

rle(mas)$lengths возвращает длинну серии. Для получения индексов элементов, с которых начинается новая серия, используем кумулятивную сумму.

Результат:

#  [1]  1 NA NA NA NA -1 NA NA NA NA NA NA NA NA NA NA NA NA  1 NA NA NA -1 NA
→ Ссылка