【问题标题】:dplyr not filtering dates correctlydplyr 没有正确过滤日期
【发布时间】:2021-09-07 20:41:53
【问题描述】:

我有一个数据结构,它看起来像dput 形式:

test_df <- structure(list(dob = structure(c(-25932, -25932, -25932, -25932, 
                                            -25932, -25932, -25932, -25932, -25932, -25932, -25932, -25932, 
                                            -25932, -25932, -16955, -13514, -12968, -12419, -12237, -11537, 
                                            -10168, -9742, -9376, -9131, -8766, -8676, -8462, -8189, -8036,
                                            NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), class = "Date")), class = "data.frame", row.names = c(NA, 
                                                                                                           -45L))

这应该产生一个有 45 行的变量。

如果我然后运行:

test_include &lt;- test_df %&gt;% filter(dob == '1899-01-01')

这将返回适当数量的行,即 14。

但是,如果我做与此相反的操作并过滤所有不等于 '1899-01-01' 的行,它会返回一个奇怪的结果:

test_exclude &lt;- test_df %&gt;% filter(dob != '1899-01-01')

不是返回 31 行 (45 - 14),而是返回 15 行,这没有任何意义。

有没有人能解释为什么会这样?

【问题讨论】:

  • 您有 NA。那些没有通过任何过滤器。

标签: r dplyr


【解决方案1】:

基本上,!= 不会得到NA,请查看此post 了解更多信息,但这里有一个包含您的数据的示例

library(dplyr)
library(lubridate)

> test_df %>% filter(dob == ymd('1899-01-01')) %>% nrow()
[1] 14

> test_df %>% filter(dob != ymd('1899-01-01')) %>% nrow()
[1] 15

> test_df %>% filter(is.na(dob)) %>% nrow()
[1] 16

> test_df %>% filter(dob != ymd('1899-01-01') | is.na(dob)) %>% nrow()
[1] 31

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多