2015-10-06 38 views
0

我寫了一個函數來識別一系列加速度值中的峯值。 (我知道quantmod包& findPeaks函數,但它不能根據我的標準確定峯值。)我想將峯值識別爲在連續三次增加之後並且在連續三次減少之前的任何值。在R中:if語句給出'缺少值,其中TRUE/FALSE required'錯誤,但沒有缺失值

這是我的功能...我很抱歉,如果它非常不雅,但這是我第一次嘗試這樣做。向量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 $ lag中沒有缺失值。我可能會犯一些其他的基本錯誤,但我無法弄清楚它是什麼。

我真的很感謝一些幫助!

+0

是的,它們與行號相同。 – Laura

+0

當我用你給的例子x向量運行你的函數時,我沒有得到錯誤。它對我來說返回數字(0) –

+2

問題是'frame [l + 3,1]' - 這實際上是NA,'frame [l + 2,1]'也是這樣(我只是運行一個樣本向量'c(1,2,3)' – rbm

回答

0

OK,我想稍微簡化版本是這樣的:

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" 

,所以你可以把它採用到你的函數。

+0

(我刪除了「滯後」和需要使用'data.frame',因爲我不認爲你需要它們,但是你可以採用它來滿足你的需求) – rbm

+0

謝謝,這樣更乾淨。當我指定'for(i in 3:(length(diffs)-3))'時,我停止接收錯誤。如果我理解正確,我認爲這也是@羅蘭在他上面的評論中所指的。 – Laura