【问题标题】:Removing NA observations with dplyr::filter()使用 dplyr::filter() 删除 NA 观测值
【发布时间】:2015-05-05 15:07:18
【问题描述】:

我的数据如下所示:

library(tidyverse)

df <- tribble(
    ~a, ~b, ~c,
    1, 2, 3, 
    1, NA, 3, 
    NA, 2, 3
)

我可以使用drop_na() 删除所有NA 观察:

df %>% drop_na()

或者删除单个列中的所有NA 观察(例如a):

df %>% drop_na(a)

为什么我不能只使用普通的!= 过滤管道?

df %>% filter(a != NA)

为什么我们必须使用 tidyr 的特殊功能来移除 NA?

【问题讨论】:

  • price != "NA" 应该可以工作
  • 因为任何与NA的比较,包括NA==NA,都会返回NA
  • @Metrics:这很奇怪(对我来说)这行得通。你能解释一下为什么会这样吗?
  • 顺便说一句,这和dplyr/filter没有任何关系。
  • @user3731467 我没有diamonds 数据,但在示例数据上,Metrics 的建议有效

标签: r dplyr


【解决方案1】:

例如:

你可以使用:

df %>% filter(!is.na(a))

删除 a 列中的 NA。

【讨论】:

    【解决方案2】:

    如果有人在2020年在这里,在制作完所有管道后,如果你管道%&gt;% na.exclude将带走管道中的所有NA!

    【讨论】:

      【解决方案3】:

      来自@Ben Bolker:

      [T]his 与 dplyr::filter() 无关

      来自@Marat Talipov:

      [A]任何与 NA 的比较,包括 NA==NA,都将返回 NA

      来自@farnsy 的related answer

      == 运算符不会像您期望的那样处理 NA。

      认为 NA 的意思是“我不知道那里有什么”。正确答案 to 3 > NA 显然是 NA 因为我们不知道缺失值是否 是否大于 3。好吧,NA == NA 也是一样。他们是 两个缺失值但真实值可能完全不同,所以 正确答案是“我不知道”。

      R 不知道您在分析中在做什么,所以不是 可能会引入稍后最终会发布的错误 一个尴尬的你,它不允许比较运算符认为 NA 是一个值。

      【讨论】:

        【解决方案4】:

        我一直用这个,效果很好

        cool$day[cool$day==''] <- NA  
        cool$day[is.na(cool$day)] <- "NA"
        
        cool <- cool[!cool$day == "NA", ]
        

        【讨论】:

          猜你喜欢
          • 2014-08-26
          • 1970-01-01
          • 1970-01-01
          • 2016-07-20
          • 1970-01-01
          • 2022-11-03
          • 1970-01-01
          • 2017-05-27
          • 1970-01-01
          相关资源
          最近更新 更多