Home Articles

计算日期差异

Asked
Viewed 817 times
-1

我对R比较陌生,我希望有人能为我回答这个问题 . 我在数据框proc_id,mco_id,start_date和end_date中有四列 . PLEASE CLICK ON THIS IMAGE TO SEE THE DATAFRAME.这是我要追求的逻辑 . 对于proc_id和mco_id的每个组合,如果start_date恰好位于前一个end_date之后,则proc_id和mco_id组合的最终数据帧是最小开始日期和最大结束日期 .

例如,前三行分别包含1234和ABC for proc_id和mco_id . 数据框第3行的开始日期是第2行结束日期后的第一天,第2行的开始日期是第1行结束日期后的第一天 . 因此,我的最终数据帧为proc_id,mco_id为1234和ABC的开始日期必须为“2014-01-01”,结束日期为“2014-07-01” . 现在,如果proc_id和mco_id组合的开始日期大于滞后结束日期的1天,那么它们保持原样 . 最后,如果开始日期在滞后结束日期之前,则类似于第一个实例,考虑proc_id和mco_id组合的最小开始日期和最大结束日期 . 所以,这是我对最终数据帧的期望 .

This is the final data frame that I would like to get.

任何帮助将不胜感激 .

1 Answer

  • 0

    这是一个包含 dplyr 包的快速解决方案:

    df %>% 
        group_by(proc_id, mco_id) %>% 
        summarise(start=min(start_date), end = max(end_date))
    
    Source: local data frame [4 x 4]
    Groups: proc_id [?]
    
      proc_id mco_id      start        end
       <fctr> <fctr>     <date>     <date>
    1    1234    ABC 2014-01-01 2014-07-01
    2    2345    DEF 2014-06-01 2014-07-31
    3    3456    ABC 2015-01-01 2015-03-30
    4    4567    ABC 2015-04-15 2015-04-30
    

    df 使用:

    df <- structure(list(proc_id = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 
    3L, 4L), .Label = c("1234", "2345", "3456", "4567"), class = "factor"), 
    mco_id = structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L), .Label = c("ABC", 
    "DEF"), class = "factor"), start_date = structure(c(16071, 
    16161, 16191, 16222, 16252, 16436, 16478, 16540), class = "Date"), 
    end_date = structure(c(16160, 16190, 16252, 16251, 16282, 
    16495, 16524, 16555), class = "Date")), class = "data.frame", .Names = c("proc_id", 
    "mco_id", "start_date", "end_date"), row.names = c(NA, -8L))
    

    注意:我会花更多时间将您的图片转录为可读形式 . 请在将来提供可重复的示例 .

Related