x1 <- c(4,3,3,2,4,2,2,1,1,1)
x2 <- c(4,3,3,2,3,2,2,1,1,1)
Вы почти наверняка можете нарушить этот алгоритм, но вот первая попытка: замените местоположения увеличенными значениями на NA, а затем заполните их предыдущим местоположением.
dfun <- function(x) {
r <- replace(x,which(c(0,diff(x))>0),NA)
zoo::na.locf(r)
}
dfun(x1)
dfun(x2)
Это дает «менее идеальный» ответ во втором случае.
Для записи я тоже попробовал
dfun2 <- function(x) {
s <- as.stepfun(isoreg(-x))
-s(seq_along(x))
}
, но первый пример не обрабатывается так, как хотелось бы.
Вы также можете попытаться сделать это с помощью дискретного программирования (о котором я почти ничего не знаю) или чуть более сложной формы грубой силы - используйте стохастический алгоритм, который строго наказывает немонотонность и слабо наказывает расстояние от начальная последовательность ... (например, optim(..., method="SANN")
с функцией-кандидатом, которая добавляет или вычитает 1 из произвольного элемента)