【问题标题】:Unexpected return for NA in factor lookup因子查找中 NA 的意外回报
【发布时间】:2020-10-11 16:06:56
【问题描述】:

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

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 &lt;- condLookup[vector1]vector2 的长度将与vector1 相同除非vector1 中的每个元素都是 NA。在这种情况下,vector2 的长度与condLookup 的长度相同。 你能解释一下这种行为吗?

【问题讨论】:

标签: r subset na r-factor


【解决方案1】:

除了@Ben 的回答——回收,?Extract 显示以下语句:

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

【讨论】:

    【解决方案2】:

    NA 值是输入的,类型很重要:c(NA,"spinach")NA 强制转换为字符,它不会被回收:

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

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

    字符向量将与对象的“名称”相匹配

    ... ‘i’, ‘j’, ‘...’ 可以是合乎逻辑的 向量,指示要选择的元素/切片。这样的载体 必要时回收以匹配相应的范围。

    【讨论】:

    • 这也很好地解释了为什么 a[ c( NA, NA, NA, NA, NA, NA )] 会产生 6 个 NA,而不是 4 个 :)
    猜你喜欢
    • 2020-07-05
    • 2013-06-11
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多