【问题标题】:How to use NA in if..else if statement in R如何在 R 中的 if..else if 语句中使用 NA
【发布时间】:2021-05-25 01:40:23
【问题描述】:

我创建了这个小例子。我想打印一些值,例如,使用if else 语句为NA 值打印B

x = c(1,7,NA, 3, NA, NA)

for(i in 1: length(x)){
  y = x[i]
  if(y == 1){
    print("A")
  }
  else if(y == 'NA'){
    print("B")
  }
  else{
    print("C")
  }
}

我收到一条错误消息Error in if (y == 1) { : missing value where TRUE/FALSE needed 为什么我不能为NA 值打印B?如何在if else语句中使用NA

【问题讨论】:

  • 你需要is.na(y)

标签: r for-loop if-statement


【解决方案1】:

问题还在于 ==NA 返回 NA 而不是 FALSE。确保添加一个条件来检查NA。此外,y == 'NA' 应替换为 is.na(y)

for(i in 1:length(x)){
  y = x[i]
  if(y == 1 & !is.na(y)){
    print("A")
  }
  else if(is.na(y)){
    print("B")
  }
  else{
    print("C")
  }
}

-输出

[1] "A"
[1] "C"
[1] "B"
[1] "C"
[1] "B"
[1] "B"

或者这可以通过矢量化方式完成

c("C", "B", "A")[1 + is.na(x) + 2 *(x %in% 1)]
#[1] "A" "C" "B" "C" "B" "B"

【讨论】:

    【解决方案2】:

    为避免重复,请确保第一个块检查 NA:

    x = c(1,7,NA, 3, NA, NA)
    
    for(i in 1: length(x)){
      y = x[i]
      if(is.na(y)){
        print("B")
      }
      else if(y == 1){
        print("A")
      }
      else{
        print("C")
      }
    }
    
    [1] "A"
    [1] "C"
    [1] "B"
    [1] "C"
    [1] "B"
    [1] "B"
    

    【讨论】:

      【解决方案3】:

      您可以使用case_when 或嵌套ifelse 使用矢量化方式-

      dplyr::case_when(is.na(x) ~ 'B', 
                       x == 1 ~ 'A', 
                       TRUE ~ 'C')
      
      #[1] "A" "C" "B" "C" "B" "B"
      

      【讨论】:

        猜你喜欢
        • 2016-11-13
        • 2016-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多