【问题标题】:In R: if statement gives 'missing value where TRUE/FALSE needed' error, but there are no missing values在 R 中:if 语句给出“需要 TRUE/FALSE 的缺失值”错误,但没有缺失值
【发布时间】: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


【解决方案1】:

好的,我认为稍微简化的版本是这样的:

  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"

这样你就可以将它应用到你的功能中。

【讨论】:

  • (我删除了 lags 和使用 data.frame 的需要,因为我认为您不需要它们,但您可以根据需要采用它)
  • 谢谢,这样干净多了。当我指定for(i in 3:(length(diffs)-3)) 时,我不再收到错误消息。如果我理解正确的话,我认为这也是@Roland 在上面的评论中所指的!
猜你喜欢
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
相关资源
最近更新 更多