dplyr条件分组日期

时间:2017-06-22 15:46:39

标签: r dataframe dplyr

我有这种格式的数据框

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是通过accountID进行分组来解决的情况,并且max,min可以使用

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您的数据:

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