【问题标题】:dplyr conditional grouping datesdplyr 条件分组日期
【发布时间】:2017-06-22 15:46:38
【问题描述】:

我有一个这种格式的数据框

Account ID, Start Date, End Date
      1   , 2016-01-01, 2016-02-01
      1   , 2016-02-02, 2016-03-01
      1   , 2016-03-01, 2016-04-01
      2   , 2016-01-01, 2016-02-01
      2   , 2016-03-02, 2016-03-20
      2   , 2016-03-21, 2016-04-01

我希望生成的数据框看起来像。

Account ID, Start Date, End Date
      1   , 2016-01-01, 2016-04-01
      2   , 2016-01-01, 2016-02-01
      2   , 2016-03-02, 2016-04-01

如果一个帐户的结束日期和后续开始日期之间的时间少于 7 天,它将合并为一个,并使用后一个记录的结束日期和前一个记录的开始日期。

我已经尝试使用 dplyr 对 Lead 和 Lag 进行分组,但这不适用于具有 3 条或更多记录的帐户。

在示例中,

帐户 ID 1 是一种可以通过按帐户 ID 分组来解决的情况,并且 max、min 可以工作

但帐户 ID 2 是这种情况下不起作用的情况。

非常感谢任何帮助。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    您的数据:

    dat <- read.table(text = "AccountID StartDate  EndDate
    1         2016-01-01 2016-02-01
    1         2016-02-02 2016-03-01
    1         2016-03-01 2016-04-01
    2         2016-01-01 2016-02-01
    2         2016-03-02 2016-03-20
    2         2016-03-21 2016-04-01", header = TRUE, stringsAsFactors = FALSE)
    dat[2:3] <- lapply(dat[2:3], as.Date)
    

    分组后可以使用lag

    library(dplyr)
    group_by(dat, AccountID) %>%
      mutate(
        week = cumsum(StartDate - lag(EndDate, default = 0) > 7)
      ) %>%
      group_by(AccountID, week) %>%
      summarize(
        StartDate = min(StartDate),
        EndDate = max(EndDate)
      ) %>%
      ungroup()
    # # A tibble: 3 × 4
    #   AccountID  week  StartDate    EndDate
    #       <int> <int>     <date>     <date>
    # 1         1     1 2016-01-01 2016-04-01
    # 2         2     1 2016-01-01 2016-02-01
    # 3         2     2 2016-03-02 2016-04-01
    

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2021-10-25
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2013-03-16
      • 2021-10-30
      相关资源
      最近更新 更多