【问题标题】:how to use dplyr() to subset observations based on the difference between two date如何使用 dplyr() 根据两个日期之间的差异对观察进行子集化
【发布时间】:2017-11-18 19:21:18
【问题描述】:

我有一个数据框 (df1),其中包含一个 ID 变量和两个日期变量(dat1 和 dat2)。

我想对数据框进行子集化,以便获得 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)

【问题讨论】:

    标签: r dplyr


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2017-05-17
      • 2023-01-12
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多