我有一个具有多个日期范围的数据框(准确地说是 45):
Range Start End
1 2014-01-01 2014-02-30
2 2015-01-10 2015-03-30
3 2016-04-20 2016-10-12
... ... ...
他们永远不会重叠
我还有一个包含各种事件日期(200K+)的数据框:
Event Date
1 2014-01-02
2 2014-03-20
3 2015-04-01
4 2016-08-18
... ...
我想测试这些日期是否在以下任何范围内:
Event Date InRange
1 2014-01-02 TRUE
2 2014-03-20 FALSE
3 2015-04-01 FALSE
4 2016-08-18 TRUE
...
执行此测试的最佳方法是什么?我看过lubridate的之间 和 间隔函数以及各种 Stackoverflow 问题,但找不到好的解决方案。
最佳答案
您可以从第一个数据框创建日期范围的向量,然后使用 %in%
运算符来检查您的事件的每个日期是否在此日期范围内。假设您的第一个数据框是 dateRange
,第二个 events
,将上述逻辑放在一行中将是:
events$InRange <- events$Date %in% unlist(Map(`:`, dateRange$Start, dateRange$End))
events
Event Date InRange
1 1 2014-01-02 TRUE
2 2 2014-03-20 FALSE
3 3 2015-04-01 FALSE
4 4 2016-08-18 TRUE
我们在哪里使用
Map
创建日期范围向量。 Map
结合 :
运算符从 Start
创建日期范围列表到 End
.某处靠近 list(2014-01-01 : 2014-02-30, 2015-01-10 : 2015-03-30, 2016-04-20 : 2016-10-12 ...)
(象征性地,无效),带有 unlist
,我们将其展平为日期范围的向量,然后可以与 %in%
一起使用方便。
关于r - 使用 R 测试日期是否出现在多个日期范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933800/