Поздно стороне, но это могло бы быть представляющим интерес для других. Можно в наше время использовать (внутреннюю) функцию find_peaks
от ggpmisc
пакет. Можно параметризовать его с помощью threshold
, span
и strict
аргументы. С тех пор ggpmisc
пакет нацелен на использование с ggplot2
, можно непосредственно вывестись на печать минимумы и максимумы использование stat_peaks
и stat_valleys
функции:
set.seed(1)
x <- 1:10
y <- runif(10)
# Maxima
x[ggpmisc:::find_peaks(y)]
[1] 4 7
y[ggpmisc:::find_peaks(y)]
[1] 0.9082078 0.9446753
# Minima
x[ggpmisc:::find_peaks(-y)]
[1] 5
y[ggpmisc:::find_peaks(-y)]
[1] 0.2016819
# Plot
ggplot(data = data.frame(x, y), aes(x = x, y = y)) + geom_line() + stat_peaks(col = "red") + stat_valleys(col = "green")
Нахождение локальные максимумы и минимумы для не так легкая последовательность, например, 1 0 1 1 2 0 1 1 0 1 1 1 0 1
я дал бы их положения в (1), 5, 7.5, 11 и (14) для максимумов и 2, 6, 9, 13 для минимумов.
#Position 1 1 1 1 1
# 1 2 3 4 5 6 7 8 9 0 1 2 3 4
x <- c(1,0,1,1,2,0,1,1,0,1,1,1,0,1) #Frequency
# p v p v p v p v p p..Peak, v..Valey
peakPosition <- function(x, inclBorders=TRUE) {
if(inclBorders) {y <- c(min(x), x, min(x))
} else {y <- c(x[1], x)}
y <- data.frame(x=sign(diff(y)), i=1:(length(y)-1))
y <- y[y$x!=0,]
idx <- diff(y$x)<0
(y$i[c(idx,F)] + y$i[c(F,idx)] - 1)/2
}
#Find Peaks
peakPosition(x)
#1.0 5.0 7.5 11.0 14.0
#Find Valeys
peakPosition(-x)
#2 6 9 13
peakPosition(c(1,2,3,2,1,1,2,1)) #3 7