【问题标题】:Filtering rows in R unexpectedly removes NAs when using subset or dplyr::filter使用子集或 dplyr::filter 时,过滤 R 中的行会意外删除 NA
【发布时间】:2016-07-20 11:14:55
【问题描述】:

我有一个数据集 df,我想删除变量 y 不具有值 a 的所有行。变量y 还包含一些NAs

df <- data.frame(x=1:3, y=c('a', NA, 'c'))

我可以使用 R 的索引语法来实现这一点,如下所示:

df[df$y!='a',]

  x    y
  2 <NA>
  3    c

请注意,这将返回 NA 和值 c - 这是我想要的。

但是,当我使用 subsetdplyr::filter 尝试相同的操作时,NA 会被删除:

subset(df, y!='a')

  x    y
  3    c

dplyr::filter(df, y!='a')
  x    y
  3    c

为什么subsetdplyr::filter 会这样工作?对我来说这似乎不合逻辑 - NAa 不同,那么当我指定除变量 y 等于 a 的行之外的所有行时,为什么要去掉 NA

除了明确要求NAs返回之外,还有什么方法可以改变这些函数的行为,即

subset(df, y!='a' | is.na(y))

谢谢

【问题讨论】:

  • 我认为这是默认选项
  • 您确定您的“正确”行为示例df[df$y!='a',] 会返回您所说的返回值吗?因为我得到了不同的东西。如果我们能就返回的内容达成一致,我可以更全面地解释这一点,而不仅仅是说“就是这样”。
  • 看看:github.com/hadley/dplyr/issues/812 - Romain 建议您明确地继续
  • @StevenBeaupré 不错的答案。

标签: r filter dplyr subset na


【解决方案1】:

您的“预期”行为示例实际上并未返回您在问题中显示的内容。我明白了:

> df[df$y != 'a',]
    x    y
NA NA <NA>
3   3    c

这可能比subsetdplyr::filter 返回的错误更多。请记住,在 R 中,NA 的真正意思是“未知”,所以 df$y != 'a' 返回,

> df$y != 'a'
[1] FALSE    NA  TRUE

所以 R 被告知你绝对不想要第一行,你确实想要最后一行,但是你是否想要第二行实际上是“未知的”。结果,它包含了一行所有NAs。

很多人不喜欢这种行为,但事实就是如此。

subsetdplyr::filter 做出不同的默认选择,即简单地删除 NA 行,这可以说是准确的。

但实际上,这里的教训是,如果您的数据有 NAs,那只意味着您需要在所有点上进行防御性编码,要么使用 is.na(df$y) | df$y != 'a' 之类的条件,要么如其他答案中所述通过使用基于match%in%


来自base::Extract

在提取时,数字、逻辑或字符 NA 索引选择未知元素,因此返回 NA

来自?base::subset

缺失值被视为假[...]对于普通向量,结果只是x[subset &amp; !is.na(subset)]

来自?dplyr::filter

[ 的基本子集不同,条件评估为NA 的行将被删除

【讨论】:

  • 这些所谓的人认为df$y != 'a'应该返回什么? NA 是不可比较的,所以它不能返回 TRUE 或 FALSE,== 是矢量化的,所以它不能返回长度为 2 的东西
  • @rawr 我自己对此并没有强烈的感觉,但我已经参与和/或目睹了一些与认为它不好的人的激烈交流。老实说,我不记得他们认为这种行为应该是什么。
  • 感谢@joran,这解释了这种行为。重新运行我的代码,我发现df[df$y != 'a',] 的结果确实与我在问题中的结果不同,但会保留 q 原样,因为从您的回答中可以清楚地看出“预期行为”应该是什么。跨度>
【解决方案2】:

一种解决方法是使用%in%

subset(df, !y %in% "a")
dplyr::filter(df, !y %in% "a")

【讨论】:

  • 感谢您的回答,但会接受 @joran 的正确答案,因为它给出了行为背后的全部原因并指出了您的解决方法
猜你喜欢
  • 1970-01-01
  • 2015-05-05
  • 2019-09-01
  • 2020-09-16
  • 2015-09-30
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多