首页 > 解决方案 > '需要 TRUE/FALSE 的缺失值'

问题描述

我收到了错误

Error in if (x[i] == 0 && x[i - 1] > 0) { : 
  missing value where TRUE/FALSE needed

在数值向量上运行此函数时

number_rn <- function(x) {
  a <- 0
  for (i in 1:length(x)) {
    if (x[i] == 0 && x[i-1] > 0) {
      a <- a +1
    }
  }
  print(a)
}

但是,以下功能可以正常工作:

number_rr <- function(x) {
  a <- 0
  for (i in 1:length(x)) {
    if (x[i] > 0 && x[i-1] > 0) {
      a <- a +1
    }
  }
  print(a)
}

我从以前对类似问题的回答中注意到,如果if条件没有 aTRUEFALSE结果,则可能会发生这种情况,但我认为在我的示例中并非如此。什么可能导致此错误?

标签: r

解决方案


for 循环有几个问题(即使x不包含任何NA值):

  1. 在第一次迭代 ( i == 1) 中,x[i-1]指的x[0]是未定义的,因为 R 中的索引从 开始1
  2. 该代码使用 for 循环,其中可以使用矢量化函数。

不幸的是,在 处开始循环i == 2,即,for (i in 2:length(x))在单元素向量 where 的情况下不是防错的length(x) == 1

我的建议是使用矢量化版本

number_rn_vec <- function(x) {
  n <- length(x)
  sum(x[2:n] == 0 & x[1:(n - 1)] > 0, na.rm = TRUE)
}

对于许多用例,这将返回a而不会出错:

sapply(
  list(
    c(),
    c(1),
    c(1, 0),
    c(1, 0, 3),
    c(0, 1, 0, 3),
    c(NA, 1, 0, 3),
    c(1, NA, 0, 3),
    c(1, 0, NA, 3),
    c(1, 0, 3, NA)
  ),
  number_rn_vec
)
[1] 0 0 1 1 1 1 0 1 1

推荐阅读