如何用tidy方法在R中查找行程数据的缺失日期区间?
寻找行程时间线中的中断时段
我有一个包含起始日期(start)和结束日期(end)的数据框,每一行代表一段特定行程。这些日期范围构成了一条连续的时间线,但4月左右存在一处数据中断/缺失(因未产生任何行程)。希望找到该时段的起始和结束日期,优先采用tidy方法。
原数据与可视化
library(tidyverse) df <- data.frame( start = as.Date(c("2022-01-03", "2022-01-18", "2022-01-31", "2022-03-01", "2022-03-08", "2022-03-09", "2022-04-15", "2022-04-20", "2022-04-20", "2022-05-03", "2022-05-17", "2022-05-17", "2022-05-31", "2022-06-05", "2022-06-22", "2022-06-28", "2022-07-11")), end = as.Date(c("2022-01-18", "2022-01-31", "2022-03-01", "2022-03-08", "2022-03-09", "2022-03-25", "2022-04-20", "2022-04-20", "2022-05-03", "2022-05-17", "2022-05-17", "2022-05-31", "2022-06-05", "2022-06-22", "2022-06-28", "2022-07-11", "2022-07-17")) ) %>% mutate(trip_number = as.character(row_number())) # 可视化行程时间线 df %>% ggplot() + geom_segment(aes(x = start, xend = end, y = 0, yend = 0, col = trip_number)) + theme(legend.position = "none")

由reprex包(v2.0.1)于2022-07-17生成
tidy方法解决方案
通过对比连续行程的结束与起始日期,找出时间间隔大于0的时段,就是我们要找的中断期:
df %>% arrange(start) %>% # 确保行程按时间顺序排列 mutate( prev_end = lag(end), # 获取上一段行程的结束日期 gap_start = prev_end + 1, # 中断起始日:上一段结束的次日 gap_end = start - 1, # 中断结束日:当前段开始的前一日 gap_days = gap_end - gap_start + 1 # 计算中断天数 ) %>% filter(gap_days > 0) %>% # 筛选出存在中断的记录 select(gap_start, gap_end, gap_days)
运行后输出结果:
gap_start gap_end gap_days 1 2022-03-26 2022-04-14 20
逻辑说明
- 先按起始日期排序,保证行程的时间顺序正确,避免因数据顺序混乱导致计算错误
- 用
lag(end)提取上一行的结束日期,和当前行的起始日期做对比 - 中断时段的起始是上一段行程结束的次日,结束是当前段行程开始的前一日
- 筛选出中断天数大于0的记录,就是存在缺失的时段
内容的提问来源于stack exchange,提问作者CyG
相关产品推荐
相关产品推荐

