';缺少需要TRUE/FALSE的值';

';缺少需要TRUE/FALSE的值';,r,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

我收到了错误

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\u rn这很可能发生,因为向量x有空值或NA值。看看当我尝试运行带有NULL值的if条件时会发生什么-

x <- NULL
if (x == 0 && x > 5) print("yes")
x5)打印(“是”)

确保使用is.na()或is.null()删除任何NAs或空值,您应该会很好

for循环存在一些问题(即使
x
不包含任何
na
值):

  • 在第一次迭代(
    i==1
    )中,
    x[i-1]
    指的是
    x[0]
    ,由于R中的索引从
    1
    开始,因此未定义
  • 代码使用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)
    }
    

    你在哪个向量上运行函数?很可能
    i
    大于
    x
    的长度。无论如何,您的术语之一是NA,请检查
    i
    x[i]
    x[i-1]
    …我的向量中没有空值或NA值。然而,我相信当向量的第一个元素为零时,问题就会出现。在这种情况下,x[i]==0计算为true,x[i-1]>0计算为NA。如果x[1]=0,解决方案可能是跳到下一个元素?如果有的话,有什么办法吗?谢谢
    number_rn_vec <- function(x) {
      n <- length(x)
      sum(x[2:n] == 0 & x[1:(n - 1)] > 0, na.rm = TRUE)
    }
    
    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