Пусть v
будет простым вектором и определит пик как элемент, который строго больше, чем элементы с обеих сторон, и аналогично для впадины.
1) rollapply Затем следующее дает два логических вектора, каждый из которых имеет ту же длину, что и v. Один указывает позиции пиков, используя TRUE и FALSE для других позиций, а другой указывает впадины в тех же манера. which(peaks)
и which(troughs)
могут быть использованы для получения индексных чисел, если это представление предпочтительнее.
library(zoo)
peaks <- rollapply(v, 3, function(x) x[2] > max(x[-2]), fill = FALSE)
troughs <- rollapply(v, 3, function(x) x[2] < min(x[-2]), fill = FALSE)
Мы можем объединить их так, где каждый выходной компонент равен 1, если это пик, -1 если это корыто и 0 в противном случае.
extreme <- function(x) (x[2] > max(x[-2])) - (x[2] < min(x[-2]))
rollapply(v, 3, extreme, fill = FALSE)
2) Base R Базовый метод R будет:
prev <- c(NA, v[-length(v)])
post <- c(v[-1], NA)
(v > pmax(prev, post)) - (v < pmin(prev, post))