在R中填充数据框月度日期间隔并校验ID时间完整性
填充缺失月度日期并验证时间序列完整性
针对你提供的月度日期数据框,以下是用R的tidyverse工具链实现日期填充和完整性检查的方案:
1. 加载依赖包
library(tidyverse)
2. 构造示例数据(你提供的代码)
Test = as.Date(c("2018-08-01", "2018-07-01", "2018-06-01", "2019-08-01","2018-08-01", "2018-07-01", "2018-06-01", "2019-08-01")) ID = c(1,1,1,1,2,2,2,2) x = data.frame(Test,ID)
3. 填充缺失的月度日期
按ID分组后,为每个ID生成从最早到最晚日期的完整月度序列,再与原数据左连接,自动补全缺失日期:
filled_x <- x %>% group_by(ID) %>% complete(Test = seq.Date(min(Test), max(Test), by = "month")) %>% ungroup()
处理后,每个ID的所有月度日期都会被保留,原数据中存在的日期会保留原记录,缺失的日期会新增行,若有其他列则对应位置显示NA。
4. 检查每个ID的时间区间是否完整
通过对比实际日期数量与理论应有的月度总数,判断每个ID的时间序列是否完整:
completeness_check <- filled_x %>% group_by(ID) %>% summarise( actual_dates = n(), expected_dates = interval(min(Test), max(Test)) %/% months(1) + 1, is_complete = actual_dates == expected_dates ) %>% ungroup()
actual_dates:每个ID实际拥有的日期行数expected_dates:从该ID最早日期到最晚日期的总月度数(加1是因为包含首尾两个日期)is_complete:布尔值,标记该ID的时间序列是否完整
结果说明
- 运行
filled_x可查看填充后的完整数据框,每个ID都会包含2018-06-01至2019-08-01的所有月度日期 - 运行
completeness_check会输出每个ID的完整性检查结果,示例数据处理后is_complete都会为TRUE
内容的提问来源于stack exchange,提问作者MA_1760
相关产品推荐
相关产品推荐

