【问题标题】:Number of active months based on grouped time intervals基于分组时间间隔的活动月数
【发布时间】:2021-01-24 15:41:13
【问题描述】:

我有一张表格,其中包含在时间间隔(以开始日期和结束日期为界)执行活动的个人。他们中的一些人有几项活动,而另一些则没有。有时这些活动会重叠,有时它们会被一段时间的不活动分开。

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

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

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

【问题讨论】:

  • Antoine,你不应该是 4 个活跃月吗?考虑从 4 月 1 日开始到 7 月 31 日结束的活动?
  • 否,因为个人在 6 月份不活跃。
  • 知道了,让我检查一下我的代码

标签: r date dplyr data.table lubridate


【解决方案1】:

我们可以在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

【讨论】:

  • Ronak,您的代码为最后一个 ID z 提供活动月份为 14,而我的代码为 ID y 提供 4 个月。
  • 感谢您的回答。但是这种解决方案在活动重叠的情况下不起作用。在我的示例中,z 在 2018 年 2 月处于活动状态,活动为 b1 和 b2。但是,我关心的是知道个人在这 13 个月期间活跃了多少个月。
  • @Antoine 更新了答案,你能检查一下吗? @Karthik 也更正了答案。
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2012-12-23
  • 1970-01-01
相关资源
最近更新 更多