在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_
"适用于此处。
答案 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