如何根据两个日期之间的差异使用dplyr()来进行子集观察

时间:2017-11-18 19:21:19

标签: r dplyr

我有一个带有ID变量和两个日期变量(dat1和dat2)的数据框(df1)。

我希望对数据框进行子集化,以便获得dat2和dat1之间的差异小于或等于30天的观察结果。

我试图使用dplyr(),但我无法使用它。

非常感谢任何帮助。

起点(df):

df1 <- data.frame(ID=c("a","b","c","d","e","f"),dat1=c("01/05/2017","01/05/2017","01/05/2017","01/05/2017","01/05/2017","01/05/2017"),dat2=c("14/05/2017","05/06/2017","23/05/2017","15/10/2017","15/11/2017","15/12/2017"), stringsAsFactors = FALSE)

期望结果(df):

dfgoal <- data.frame(ID=c("a","c"),dat1=c("01/05/2017","01/05/2017"),dat2=c("14/05/2017","23/05/2017"),newvar=c(13,22))

当前代码:

library(dplyr)
df2 <-   df1  %>% mutate(newvar = as.Date(dat2) - as.Date(dat1))  %>% 
        filter(newvar <= 30)

1 个答案:

答案 0 :(得分:1)

我们需要在进行减法之前转换为Date

library(dplyr)
library(lubridate)
df1 %>%
    mutate_at(2:3, dmy) %>%
    mutate(newvar = as.numeric(dat2- dat1)) %>% 
    filter(newvar <=30)

as.Date还需要包含format参数,否则,它会认为格式在接受的%Y-%m-%d中。在这里,它在%d/%m/%Y

df1 %>% 
     mutate(newvar = as.numeric(as.Date(dat2, "%d/%m/%Y") - as.Date(dat1, "%d/%m/%Y"))) %>%
     filter(newvar <= 30)
#    ID       dat1       dat2 newvar
#1  a 01/05/2017 14/05/2017     13
#2  c 01/05/2017 23/05/2017     22