Je suis d'accord avec la réponse de whuber, mais je voulais juste ajouter que la partie "+2" du code, qui tente de décaler l'index pour correspondre au pic nouvellement trouvé, "dépasse les limites" et devrait être "+1". par exemple dans l'exemple en question, nous obtenons:
> findPeaks(cc)
[1] 3 22 41 59 78 96
lorsque nous mettons en évidence ces pics trouvés sur un graphique (rouge gras):

nous voyons qu'ils sont toujours à 1 point du pic réel.
conséquenty
pks[x[pks - 1] - x[pks] > thresh]
devrait être pks[x[pks] - x[pks + 1] > thresh]oupks[x[pks] - x[pks - 1] > thresh]
GRANDE MISE À JOUR
suivant ma propre quête pour trouver une fonction de recherche de pic adéquate, j'ai écrit ceci:
find_peaks <- function (x, m = 3){
shape <- diff(sign(diff(x, na.pad = FALSE)))
pks <- sapply(which(shape < 0), FUN = function(i){
z <- i - m + 1
z <- ifelse(z > 0, z, 1)
w <- i + m + 1
w <- ifelse(w < length(x), w, length(x))
if(all(x[c(z : i, (i + 2) : w)] <= x[i + 1])) return(i + 1) else return(numeric(0))
})
pks <- unlist(pks)
pks
}
un «pic» est défini comme un maximum local dont les mpoints de chaque côté sont plus petits que lui. par conséquent, plus le paramètre est grand m, plus la procédure de financement de pointe est stricte. donc:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
la fonction peut également être utilisée pour trouver des minima locaux de tout vecteur séquentiel xvia find_peaks(-x).
Remarque: j'ai maintenant mis la fonction sur gitHub si quelqu'un en a besoin: https://github.com/stas-g/findPeaks