筛选大于或等于的开始日期和包含月份作为字符串的结束日期

Filter Start Date with Greather Than or Equal To and End Date that Contains Months as Strings

library(tidyverse)
library(lubridate)    

我刚开始使用 tidyverse 中的日期,我正在尝试按大于或等于 2017 年 5 月 8 日的 Start_Date 和 End_Date 进行过滤包含 AUG 或 JUL 月份。

我尝试使用下面的代码。我首先在 Start_Date 列上使用 lubridate::mdy,这样我可以按日期过滤,但将 End_Date 列保留为字符,这样我就可以使用 dplyr::filterstringr::str_detect .

Df <- Df %>% 
        mutate_at(vars(Start_Date),funs(lubridate::mdy)) %>%
        filter(Start_Date >= "08-MAY-2017") %>%
        filter(str_detect(End_Date),"AUG|JUL")

这行不通,我不确定这是否是实现此目的的最佳 tidyverse 方法,特别是因为我有两条过滤线和两种不同的格式 Start_Date 和 End_Date .

使用 Tidyverse 实现此目的的更好方法是什么?

示例数据:

ID <- c(455,665,667,398,345,653,999,543)
Start_Date <- c("08-May-2017","03-MAR-2017","04-APR-2017","04-JULY-2017",
                "08-MAY-2017","12-AUG-2017","07-MAY-2017","16-JUL-2017")
End_Date <- c("01-SEP-2017","25-AUG-2017","08-AUG-2017","18-NOV-2017",
              "12-JUL-2017","22-JUL-2017","02-AUG-2017","15-SEP-2017")
Pet <- c("Cat","Dog","Cat","Cat","Turle","Dog","Fish","Rabbit")

Df <- data_frame(ID, Start_Date, End_Date, Pet)

您的 mutate_at 步骤似乎不起作用,但您只需要先转换为日期格式,然后应用过滤步骤(您可以一步完成)。如果您能记住 as.Date 使用的默认格式(我永远不记得)

,您可以使它更简洁
Df %>% 
    # convert to date format
    mutate_at(vars(Start_Date, End_Date),function(x) as.Date(x, format="%d-%b-%Y")) %>%
    # apply start and end filter criteria (can do in single filter call)
    filter(Start_Date >= as.Date("08-05-2017", format="%d-%m-%Y"),
           End_Date %in% as.Date("01-07-2017", format="%d-%m-%Y"):as.Date("31-08-2017", format="%d-%m-%Y"))

编辑:我提醒自己,它需要 %Y-%m-%d 格式:

Df %>% 
    # convert to date format
    mutate_at(vars(Start_Date, End_Date),function(x) as.Date(x, format="%d-%b-%Y")) %>%
    # apply start and end filter criteria (can do in single filter call)
    filter(Start_Date >= as.Date("2017-05-08"),
           End_Date %in% as.Date("2017-07-01"):as.Date("2017-08-31"))