过滤开始日期包含更多或等于和包含月份作为字符串的结束日期

时间:2018-02-06 17:09:15

标签: r tidyverse lubridate

library(tidyverse)
library(lubridate)    

我刚接触tidyverse中的日期,我试图通过大于或等于2017年5月8日的Start_Date过滤,以及包含AUG或JUL月份的End_Date。

我尝试使用下面的代码。我首先在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")

这不起作用,我不确定它是否是实现此目的的最佳整数方法,特别是因为我有两个过滤行和两个不同的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)

1 个答案:

答案 0 :(得分:0)

您的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"))
相关问题