library(tidyverse)
library(lubridate)
我刚接触tidyverse中的日期,我试图通过大于或等于2017年5月8日的Start_Date过滤,以及包含AUG或JUL月份的End_Date。
我尝试使用下面的代码。我首先在Start_Date列上使用lubridate::mdy
,因此我可以按日期过滤,但将End_Date列保留为字符,以便我可以使用dplyr::filter
和stringr::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)
答案 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"))