r语言 - 因子查找中 NA 的意外回报



我有一个因素用作查找表。

condLookup = c(hotdog = "ketchup", ham = "mustard", popcorn = "salt", coffee = "cream")

这按预期工作 - 我输入了一个 3 向量并得到一个 3 向量:

condLookup[c("hotdog", "spinach", NA)]
hotdog      <NA>      <NA> 
"ketchup"       NA        NA 

这也是意料之中的,即使回报都是NA

condLookup[c(NA, "spinach")]
<NA> <NA> 
NA   NA 

而这个:

condLookup["spinach"]
<NA> 
NA 

但后来这让我感到惊讶 - 我给出了一个原子 NA,或两个 NA,我得到了一个 4 NA 的命名向量。

condLookup[NA]
<NA> <NA> <NA> <NA> 
NA   NA   NA   NA 
condLookup[c(NA, NA)]
<NA> <NA> <NA> <NA> 
NA   NA   NA   NA 

显然,对于vector2 <- condLookup[vector1],除非vector1中的每个元素都是NA,否则vector2将与vector1长度相同。 在这种情况下,vector2的长度与condLookup相同。 你能解释一下这种行为吗?

键入NA值,并且类型很重要:c(NA,"spinach")强制NA字符,该字符不会被回收:

condLookup[NA]
## <NA> <NA> <NA> <NA> 
##   NA   NA   NA   NA 
condLookup[NA_character_]
## <NA> 
##  NA

默认的NA类型是合乎逻辑的。 逻辑向量将被回收以匹配向量的长度,而字符向量将用于匹配向量的名称。从?[

字符向量将与对象的"名称"匹配

。"我"、"J"、"..."可以是合乎逻辑的 矢量,指示要选择的元素/切片。 这样的载体 必要时回收以匹配相应的范围。

除了@Ben的答案--recycling之外,?Extract还显示以下语句:

  • 空 ("( 和 NA 索引都不匹配任何名称,甚至不匹配空名称或缺失名称。如果任何对象没有名称或适当的暗名,则它们将被视为所有",因此不匹配任何内容。

最新更新