我写了一个函数来识别一系列加速度值中的峰值。 (我知道quantmod包& findPeaks函数,但是根据我的标准,它不能识别峰值。)我想将峰值识别为连续三次增加之后的任何值,并且在连续三次减少之前。
这是我的功能...如果它非常不优雅我道歉,但这是我第一次尝试这样做。矢量x是一系列约900-1200个加速度值;例如1.003841,1.003570,1.003428,1.003261,1.003033,1.002630 ......
peakFinder <- function(x){
diffs <- sign(diff(x))
lags <- 1:length(diffs)
frame <- data.frame(diffs, lags)
frame$diffs <- ifelse(is.na(frame$diffs), 0, frame$diffs)
pks <- 0
for(l in frame$lags){
if ((frame[l,1] == 1) & (frame[l+1,1] == 1) & (frame[l+2,1] == 1)
& (frame[l+3,1] == -1) & (frame[l+4,1] == -1) & (frame[l+5,1] == -1)){
pks <- c(pks, l+2)
}
}
pks <- pks[-1]
pks
}
if语句一直给我错误“缺少需要TRUE / FALSE的值”。这很令人困惑,因为帧$ diffs或frame $ lags中没有缺失值。我可能正在做一些其他的基本错误,但我无法弄清楚它是什么。
我真的很感激一些帮助!
答案 0 :(得分:0)
好的,我认为稍微简化的版本就是这样:
x <- c(09,10,12,13,11,09,08,10,12,20,19,18,17) # peak 13 and 20
if (length(x) >= 7) # assuming length > 7
{
diffs <- sign(diff(x))
pks <- 0
for(i in 3:(length(diffs)-3))
{
if (all(diffs[(i-2):(i)]==+1) && all(diffs[(i+1):(i+3)] == -1))
{
print(paste("Peak at", x[i+1]))
}
}
}
执行时打印
[1] "Peak at 13"
[1] "Peak at 20"
所以你可以将它用于你的功能。