【问题标题】:Why I'm getting NA's when selecting by 'with'为什么我在选择“with”时会得到 NA
【发布时间】:2020-05-10 15:59:41
【问题描述】:

作为@allan-cameron 在Most concise way to get a value from within a tibble 中出色回答的跟进

如果我在band-instruments 中添加一些NA

bandy <- tibble(name = c("John", "Paul", "Keith", "Eric", NA), 
               plays = c("guitar", "bass", "guitar", NA, "kazoo")) 

with(bandy, plays[name == "John"])
# [1] "guitar" NA  

with(bandy, name[plays == "guitar"])
# [1] "John"  "Keith" NA  

有人可以解释为什么我要退回那些 NA 吗?避免退货的最优雅方法是什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为那些 NA 与with 函数或tibble 格式无关。参见例如:

    x <- c(1, 2, NA)
    x[x == 1]
    #> [1]  1 NA
    

    reprex package (v0.3.0) 于 2020-05-10 创建

    对于==函数的帮助页面,我们可以阅读:

    缺失值 (NA) 和 NaN 值即使与它们自身也被视为不可比较,因此涉及它们的比较总是会导致 NA。

    [函数的帮助页面我们可以阅读:

    提取时,数字、逻辑或字符 NA 索引选择未知元素,因此在逻辑、整数、数字、复数或字符结果的相应元素中返回 NA,对于列表返回 NULL。 (对于原始结果,它返回 00。)

    这就是代码返回NA 的原因。

    IMO 避免这些 NA 的最简单方法如下:

    library(tibble)
    bandy <- tibble(name = c("John", "Paul", "Keith", "Eric", NA), 
                    plays = c("guitar", "bass", "guitar", NA, "kazoo")) 
    
    with(bandy, plays[name == "John" & !is.na(name)])
    #> [1] "guitar"
    with(bandy, name[plays == "guitar" & !is.na(plays)])
    #> [1] "John"  "Keith"
    

    reprex package (v0.3.0) 于 2020-05-10 创建

    【讨论】:

      【解决方案2】:

      我们也可以使用%in%,它返回FALSE,其中有NA

      with(bandy, plays[name %in% 'John'])
      #[1] "guitar"
      

      【讨论】:

        【解决方案3】:

        我无法弄清楚原因。但是,这是解决方案。

        > with(bandy, plays[(name == "John") & !is.na(name)])
        [1] "guitar"
        
        > with(bandy, name[(plays == "guitar") & !is.na(plays)])
        [1] "John"  "Keith"
        

        另一个选项是使用 dplyr

        > filter(bandy, name == "John")$plays
        [1] "guitar"
        
        > filter(bandy, plays == "guitar")$name 
        [1] "John"  "Keith"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-09
          • 1970-01-01
          • 1970-01-01
          • 2012-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多