“缺少需要TRUE / FALSE的值”

时间:2018-10-01 22:02:00

标签: r

我收到了错误

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条件没有TRUEFALSE的结果,则可能会发生这种情况,但我不认为这是在我的例子中。是什么原因导致此错误?

2 个答案:

答案 0 :(得分:1)

for循环存在多个问题(即使x不包含任何NA值):

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

不幸的是,在i == 2的一个元素向量的情况下,在for (i in 2:length(x))(即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

答案 1 :(得分:0)

最有可能发生这种情况,因为向量x具有NULL或NA值。看看当我尝试运行带有NULL值的if条件时会发生什么-

x <- NULL
if (x == 0 && x > 5) print("yes")

请确保使用is.na()或is.null()删除所有NA或NULL,并且应该没事