基于分组时间间隔的活跃月份数

Number of active months based on grouped time intervals

我有一个 table 个人,他们在时间间隔内(以开始和结束日期为界)执行活动。其中一些有多项活动,另一些则没有。有时活动重叠,有时又相隔一段inactivity.

我想按个人分组并计算他们活跃的月数,无论activity。

这是一个可重现的小例子:

df <- data.frame(id=c("x", "y", "y", "z", "z"),
             activity=c("a1", "b1", "b2", "c1", "c2"),
             start=c(as.Date("2017-07-01"), 
                     as.Date("2018-04-01"), as.Date("2018-07-01"), 
                     as.Date("2017-07-01"), as.Date("2018-02-01")),
             end=c(as.Date("2018-07-31"), 
                   as.Date("2018-05-31"), as.Date("2018-07-31"),
                   as.Date("2018-02-28"), as.Date("2018-07-31")))

在甘特图上看起来像这样:

有谁能想到 data.tabledplyr 的解决方案来获得以下输出?

id | active_months
x  |      13
y  |      3
z  |      13

我们可以在 startend 日期之间创建每月序列,并计算每个 id 的唯一月份值。

library(dplyr)

df %>%
  group_by(id) %>%
  summarise(months = n_distinct(unlist(purrr::map2(start, end, 
                      ~seq(.x, .y, by = 'month')))))

#   id    months
#  <chr>  <int>
#1 x         13
#2 y          3
#3 z         13