मैं व्हिबर की प्रतिक्रिया से सहमत हूं, लेकिन कोड के "+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
}
एक 'चोटी' को स्थानीय मैक्सीमा के रूप में परिभाषित किया जाता है, जिसके 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