Tôi đồng ý với phản hồi của người đăng ký nhưng chỉ muốn thêm phần "+2" của mã, cố gắng thay đổi chỉ mục để khớp với đỉnh mới được tìm thấy thực sự là 'vượt mức' và phải là "+1". ví dụ trong ví dụ trong tay, chúng tôi có được:
> findPeaks(cc)
[1] 3 22 41 59 78 96
khi chúng tôi đánh dấu các đỉnh tìm thấy này trên biểu đồ (đậm màu đỏ):

chúng tôi thấy rằng họ luôn cách đỉnh thực tế 1 điểm.
kết quả
pks[x[pks - 1] - x[pks] > thresh]
nên pks[x[pks] - x[pks + 1] > thresh]hoặcpks[x[pks] - x[pks - 1] > thresh]
CẬP NHẬT LỚN
theo nhiệm vụ riêng của tôi để tìm một chức năng tìm đỉnh thích hợp, tôi đã viết cái này:
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
}
một "đỉnh" được định nghĩa là một cực đại cục bộ với mcác điểm ở hai bên của nó nhỏ hơn nó. do đó, tham số càng lớn m, quy trình cấp vốn cao nhất càng nghiêm ngặt. vì thế:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
hàm cũng có thể được sử dụng để tìm cực tiểu cục bộ của bất kỳ vectơ tuần tự nào xthông quafind_peaks(-x) .
Lưu ý: hiện tại tôi đã đặt chức năng này trên gitHub nếu có ai cần: https://github.com/stas-g/findPeaks