【发布时间】:2015-10-06 14:06:42
【问题描述】:
我编写了一个函数来识别一系列加速度值中的峰值。 (我知道 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 的缺失值”。这是令人困惑的,因为在 frame$diffs 或 frame$lags 中都没有缺失值。我可能犯了其他一些基本错误,但我无法弄清楚它是什么。
非常感谢您的帮助!
【问题讨论】:
-
是的,它们与行号相同。
-
问题是
frame[l+3,1]- 这确实是 NA,frame[l+2,1]也是如此(我只是在样本向量上运行c(1,2,3) -
将函数中
if条件中使用的所有值的print语句放在if条件之前。如果 R 说存在缺失值,则存在缺失值。 -
如果
l在行索引上运行,为什么您想知道frame[l+1,1]、frame[l+2,1]等的条件?他们都是NA。另请注意,if (NA) {do something}返回您收到的错误。 -
您的索引超出范围。
标签: r if-statement