后台
我有以下项目的数据框架:
| ID|开始日期|结束日期|
| --|--|--|
| 01 |2019年11月6日|2021年4月7日|
| 02 |2021年12月8日|2022年1月18日|
| 03 |2019年10月24日|2019年12月3日|
| 04 |2021年9月20日|2021年11月11日|
| 05 |2021年11月11日|2021年11月11日|
我也有一个日期列表:date_list <- c(1/1/2020, 1/1/2021, 1/1,2022)
我想数一下在这些特定日期有多少项目是“活跃”的。
举例来说:在2020年1月1日,只有1个项目处于活动状态,即项目1,因为它在2020年1月1日之前开始,在2020年1月1日之后结束。换句话说,这是一个当时正在进行的项目。
当前方法
for (date in date-list) {
projects %>% filter(start_date <= date & end_date > date) %>% count()
}
这是太长了,因为我的工作与成千上万的日期和成千上万的项目列表。
5条答案
按热度按时间euoag5mw1#
您可以首先构建一个包含给定日期所有打开项目的表。这里有一个方法
返回
所以对于每个日期,我们可以看到项目数量的变化。我们可以使用
findInterval
来查找给定日期的开放事件的数量因此,在这些日期中的每个日期都有一个项目开放。测试与
ws51t4hk2#
一个有效的方法是使用
data.table::foverlaps()
,一个 * 基于快速二进制搜索的两个数据表的重叠连接 *。首先为连接创建两个
data.table
。date_list
data.table
将有一个dummy_date
字段,因为foverlaps()
可以找到重叠的范围。但在这种情况下,范围的开始和结束将是相同的。然后我们可以进行join,按
date
分组,并计算每个日期有多少个项目打开:输入数据
snvhrwxg3#
1.将
1
分配给开始日期,将-1
分配给结束日期,将0
分配给查找日期1.将所有日期绑定到一个表中,并为其分配值
1.按日期排序
1.取指定数字的累计和
1.查找日期的子集
data.table
:数据类型:
vsmadaxz4#
使用
tidyr::crossing
的另一个选项示例数据
由于所有组合都是创建的,因此这可能不是最有效的解决方案。但对1,800个约会对象的快速测试只需要一两秒钟
vptzau2j5#
不完全确定预期的结果,但这增加了每个 project 行有多少 date_list 条目是活动的。
注意:使用
projects$start_date <- as.Date(projects$start_date, "%m/%d/%Y")
和projects$end_date <- as.Date(projects$end_date, "%m/%d/%Y")
将日期转换为Date对象制备
结果
数据