我正在尝试筛选tibble特定日期。如果我尝试>=该日期和<=同一日期,代码将导致返回 0 行。我已经确定它是<=返回FALSE我认为应该返回的行TRUE。下面是一个工作示例。我只对相关回复感兴趣tidyverse-lubridate请不要使用 Base R 或其他软件包发布答案(我知道如何以这些其他方式解决问题。
数据
library(dplyr)
library(lubridate)
d <- structure(list(Date = structure(c(1572679159, 1572703322, 1572710363, 1572722578,
1572727765, 1572728767, 1572730032),
class = c("POSIXct", "POSIXt"),
tzone = "UTC", label = c(EndDate = "EndDate")),
ID = 1:7), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"),
row.names = c(NA, -7L))
Run Code Online (Sandbox Code Playgroud)
当我尝试以下操作时,它返回tibble0 行:
d %>%
filter(Date >= as_date("2019-11-02"),
Date <= as_date("2019-11-02"))
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试这样做时,它有效。我缺少什么?问题是,我想Date <= as_date("2019-11-03")返回TRUE所有“2019-11-03”提交的内容(我的数据集中实际上有这些内容),但事实并非如此。
d %>%
filter(Date >= as_date("2019-11-02"),
Date <= as_date("2019-11-03"))
Run Code Online (Sandbox Code Playgroud)
您需要将日期时间对象转换为日期类,然后进行比较。也可用于&包含多个条件进行检查。
library(dplyr)
library(lubridate)
d %>%
filter(as_date(Date) >= as_date("2019-11-02") &
as_date(Date) <= as_date("2019-11-02"))
# Date ID
# <dttm> <int>
#1 2019-11-02 07:19:19 1
#2 2019-11-02 14:02:02 2
#3 2019-11-02 15:59:23 3
#4 2019-11-02 19:22:58 4
#5 2019-11-02 20:49:25 5
#6 2019-11-02 21:06:07 6
#7 2019-11-02 21:27:12 7
Run Code Online (Sandbox Code Playgroud)
此外,我们还可以使用between
d %>%
filter(between(as_date(Date), as_date("2019-11-02"), as_date("2019-11-02")))
Run Code Online (Sandbox Code Playgroud)