как в 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 шт):
Если в качестве решения используется сравнение элемента вектора с его предыдущим элементом, то в качестве реализации можно применить функцию 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