是否可以区分NA_character_和" NA"在`switch`?

时间:2018-01-12 05:24:05

标签: r switch-statement na

Match NA's in switch() loop中,回答者表示在`NA`中使用switch会匹配缺失的值。但是,"NA"也匹配。我有一个字符向量,其中包含字符串"NA"以及缺失值NA。我将此向量的元素一个接一个地传递给switch,但无法区分这两个

for (k in c(NA, "NA")) {
  cat(switch(k, "NA_character_" = "C", "NA" = "B", `NA` = "A"))
}

#> BB

for (k in c(NA, "NA")) {
  cat(switch(k, "NA_character_" = "C", `NA` = "A", "NA" = "B"))
}

#> AA

我知道我可以使用if (is.na(k))区分它们,但使用switch的目的是限制if ... else语句的嵌套,所以我宁愿单独使用switch如果只是在备选列表中选择正确的名称。我注意到帮助文件说(我强调):

  

如果EXPR评估为字符串,则该字符串与(完全)匹配...中的元素名称

所以我想知道&#34的特定含义是否完全等于NA_character_"适用于此处。

1 个答案:

答案 0 :(得分:4)

我们可以创建一个区分三种情况的函数

f1 <- function(val){      
   switch(deparse(val),
      "NA_character_" = "C", 
       "NA" = "B", 
      '"NA"' = "A") 
 }

f1(NA)
[1] "B"
f1(NA_character_)
#[1] "C"
f1("NA")   
#[1] "A"

使用OP的循环

for(k in c(NA, "NA")) cat(f1(k), "\n")
#C
#A

在这种情况下,NA被视为NA_character_,因为它是一个字符向量。如果我们需要使用NA,请将其保存在list

for(k in list(NA, "NA")) cat(f1(k), "\n")
#B 
#A