基于分组时间间隔的活跃月份数
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.table
或 dplyr
的解决方案来获得以下输出?
id | active_months
x | 13
y | 3
z | 13
我们可以在 start
和 end
日期之间创建每月序列,并计算每个 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
我有一个 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.table
或 dplyr
的解决方案来获得以下输出?
id | active_months
x | 13
y | 3
z | 13
我们可以在 start
和 end
日期之间创建每月序列,并计算每个 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