@ Bens Lösung ist ziemlich süß. Die folgenden Fälle werden jedoch nicht behandelt:
x <- c(1,2,9,9,2,1,1,5,5,1)
which(diff(sign(diff(x)))==-2)+1
x <- c(2,2,9,9,2,1,1,5,5,1)
which(diff(sign(diff(x)))==-2)+1
x <- c(3,2,9,9,2,1,1,5,5,1)
which(diff(sign(diff(x)))==-2)+1
Hier ist eine robustere (und langsamere, hässlichere) Version:
localMaxima <- function(x) {
y <- diff(c(-.Machine$integer.max, x)) > 0L
rle(y)$lengths
y <- cumsum(rle(y)$lengths)
y <- y[seq.int(1L, length(y), 2L)]
if (x[[1]] == x[[2]]) {
y <- y[-1]
}
y
}
x <- c(1,2,9,9,2,1,1,5,5,1)
localMaxima(x)
x <- c(2,2,9,9,2,1,1,5,5,1)
localMaxima(x)
x <- c(3,2,9,9,2,1,1,5,5,1)
localMaxima(x)
which(diff(sign(diff(x)))==-2)+1
wenn sich die Werte nicht immer um eins ändern.