如何判断多组起止日期是否落在指定日期范围内?
筛选日期区间与指定日期列表重叠的记录
现有包含itemNo、start、end字段的datesToSearch数据框,需筛选出起止日期区间与指定日期列表myDates存在重叠的记录——只要区间内任意日期在该列表中,就保留该记录。
示例数据
# 指定日期列表 myDates <- c(20240320, 20240319, 20240318) # 待筛选的数据框 datesToSearch <- data.frame( itemNo = c(241, 242, 243, 244, 300), start = c(20240311, 20240316, 20240319, 20240318, 20240318), end = c(20240317, 20240317, 20240321, 20240324, 20240324) )
解决方案
方法1:Base R 实现
核心逻辑是检查每条记录的日期区间是否包含myDates中的任意一个日期,满足则保留该行:
# 确保日期为数值型(避免字符型比较问题) myDates <- as.numeric(myDates) datesToSearch$start <- as.numeric(datesToSearch$start) datesToSearch$end <- as.numeric(datesToSearch$end) # 筛选符合条件的记录 correctdatesToSearch <- datesToSearch[apply(datesToSearch, 1, function(row) { any(myDates >= row["start"] & myDates <= row["end"]) }), ] # 输出结果 correctdatesToSearch
运行后得到目标结果:
itemNo start end 3 243 20240319 20240321 4 244 20240318 20240324 5 300 20240318 20240324
方法2:dplyr 实现
若使用tidyverse工具链,可通过rowwise()逐行判断:
library(dplyr) correctdatesToSearch <- datesToSearch %>% rowwise() %>% filter(any(myDates >= start & myDates <= end)) %>% ungroup() # 输出结果 correctdatesToSearch
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

