【问题标题】:Collapsing consecutive dates into a single row将连续日期折叠成一行
【发布时间】:2018-12-12 20:03:08
【问题描述】:

我看到了很多关于如何将连续日期合并到一行的帖子,并尝试了其中的几个(包括this 和使用dplyr 中的lead),但到目前为止还没有找到专门回答的帖子我的问题。

我的数据如下所示:

df <- data.frame(
    id = c("A", "A", "A", "B", "B", "C", "C", "C"),
    start = as.Date(c("2013-05-21", "2014-03-17", "2014-12-12", "2009-03-08", 
                      "2011-07-30", "2008-10-07", "2009-11-21", "2010-12-01")),
    end = as.Date(c("2014-03-16", "2014-12-11", NA, "2011-07-14", 
                    NA, "2009-11-20", NA, NA)),
    status = c("expired", "expired", "active", "expired", 
               "active", "expired", "expired", "active")
    )

下面是我想要的输出:

id          start          end          status
A           2013-05-21     NA           active
B           2009-03-08     2011-07-14   expired
B           2011-07-30     NA           active
C           2008-10-07     NA           active 

所以我想做的是三方面的:

1) 如果行是连续的,即结束日期 + 1 是下一行的开始日期,我想将它们折叠成一行(如 id A)

2) 如果行不连续,即结束日期 + 1 不是下一行的开始日期,我想将它们分开(如 id B)

3)如果“过期”行没有结束日期,我仍然想将它们折叠成一行(如 id C)

任何帮助将不胜感激!

【问题讨论】:

    标签: r data-cleaning


    【解决方案1】:

    你可以选择类似的东西:

    library(tidyverse)
    
    df %>%
      group_by(id) %>%
      mutate(
        end = if_else(is.na(end), lead(start), end),
        flag = if_else(start <= lag(end) + 1, 0, 1),
        flag = if_else(is.na(flag), 0, flag),
        group = cumsum(flag),
        flag = NULL
      ) %>%
      group_by(id, group) %>%
      mutate(
        start = first(start),
        end = last(end),
        status = last(status)
      ) %>% ungroup() %>% 
      distinct(id, start, end, status)
    

    输出:

    # A tibble: 4 x 4
      id    start      end        status 
      <fct> <date>     <date>     <fct>  
    1 A     2013-05-21 NA         active 
    2 B     2009-03-08 2011-07-14 expired
    3 B     2011-07-30 NA         active 
    4 C     2008-10-07 NA         active 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多