ฉันเห็นด้วยกับคำตอบของ whuber แต่เพียงต้องการเพิ่มว่าส่วน "+2" ของรหัสซึ่งพยายามที่จะเปลี่ยนดัชนีให้ตรงกับจุดสูงสุดที่พบใหม่ 'เกินจริง' จริง ๆ และควรเป็น "+1" เช่นในตัวอย่างที่เราได้รับ:
> findPeaks(cc)
[1] 3 22 41 59 78 96
เมื่อเราเน้นจุดสูงสุดที่พบเหล่านี้บนกราฟ (ตัวหนาสีแดง):
เราเห็นว่ามันอยู่ห่างจากจุดสูงสุดจริงอย่างสม่ำเสมอ 1 จุด
consequenty
pks[x[pks - 1] - x[pks] > thresh]
ควรจะเป็นpks[x[pks] - x[pks + 1] > thresh]
หรือpks[x[pks] - x[pks - 1] > thresh]
อัปเดตครั้งใหญ่
ต่อไปนี้การแสวงหาของฉันเองเพื่อค้นหาฟังก์ชั่นการค้นหาสูงสุดที่เพียงพอฉันเขียนสิ่งนี้:
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
}
a 'peak' ถูกกำหนดให้เป็น maxima ท้องถิ่นโดยมีm
ทั้งสองด้านของจุดนั้นเล็กกว่านั้น ดังนั้นยิ่งพารามิเตอร์ใหญ่m
มากเท่าไหร่ก็จะยิ่งเข้มงวดมากขึ้นเท่านั้น ดังนั้น:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
ฟังก์ชั่นนี้ยังสามารถใช้ในการค้นหาท้องถิ่นขั้นต่ำของเวกเตอร์ต่อเนื่อง x
find_peaks(-x)
ผ่านทาง
หมายเหตุ: ตอนนี้ฉันได้วางฟังก์ชั่นบน gitHub หากใครต้องการ: https://github.com/stas-g/findPeaks