基于自定义时间周期聚合时序数据:全效年度圈的data.table实现
问题:基于data.table判断学年周期全效年度圈
现有如下结构的data.table时序数据:
library(data.table) dt <- data.table(ID = "ABC", TIME_FROM = structure(c(17897L, 18262L, 18353L, 18628L, 18659L, 18779L, 18993L, 19358L), class = c("IDate", "Date")), TIME_TO = structure(c(18261L, 18352L, 18627L, 18658L, 18778L, 18992L, 19357L, 19722L), class = c("IDate", "Date")), VALID = c(T, T, T, T, F, T, T, T)) dt #> ID TIME_FROM TIME_TO VALID #> 1: ABC 2019-01-01 2019-12-31 TRUE #> 2: ABC 2020-01-01 2020-03-31 TRUE #> 3: ABC 2020-04-01 2020-12-31 TRUE #> 4: ABC 2021-01-01 2021-01-31 TRUE #> 5: ABC 2021-02-01 2021-05-31 FALSE #> 6: ABC 2021-06-01 2021-12-31 TRUE #> 7: ABC 2022-01-01 2022-12-31 TRUE #> 8: ABC 2023-01-01 2023-12-31 TRUE
需要按ID判断以每年9月1日至次年8月31日为周期的全效年度圈(即该周期内所有时段的VALID均为TRUE),求简洁的纯data.table实现方案。
预期输出如下:
dt_target <- data.table(ID = "ABC", YEAR = 2019:2024, FULL_VALID_YR = c(F, T, F, T, T, F)) dt_target #> ID YEAR FULL_VALID_YR #> 1: ABC 2019 FALSE #> 2: ABC 2020 TRUE #> 3: ABC 2021 FALSE #> 4: ABC 2022 TRUE #> 5: ABC 2023 TRUE #> 6: ABC 2024 FALSE
各年份判断逻辑:
- 2019为
FALSE:缺少2018年9-12月的有效数据 - 2020为
TRUE:2019年9月1日至2020年8月31日全时段有效 - 2021为
FALSE:2021年2-5月时段无效 - 2022为
TRUE:2021年9月1日至2022年8月31日全时段有效 - 2023为
TRUE:2022年9月1日至2023年8月31日全时段有效 - 2024为
FALSE:缺少2024年1-8月的有效数据
备注:非完整年度(2019、2024)是否保留可选;可任选周期起始或结束年份命名年度。
纯data.table实现方案
library(data.table) # 1. 生成所有需要判断的学年周期 min_year <- year(min(dt$TIME_FROM)) - 1 max_year <- year(max(dt$TIME_TO)) + 1 years <- min_year:max_year dt_years <- data.table( ID = unique(dt$ID), YEAR = rep(years, each = length(unique(dt$ID))), PERIOD_START = as.IDate(paste0(YEAR, "-09-01")), PERIOD_END = as.IDate(paste0(YEAR + 1, "-08-31")) ) # 2. 区间匹配+聚合判断全效年度 dt_result <- dt_years[dt, on = .(ID, PERIOD_START <= TIME_TO, PERIOD_END >= TIME_FROM), allow.cartesian = TRUE][, .( FULL_VALID_YR = all(VALID == TRUE) && (min(pmax(TIME_FROM, PERIOD_START)) == PERIOD_START) && (max(pmin(TIME_TO, PERIOD_END)) == PERIOD_END) ), by = .(ID, YEAR)] # 输出结果 dt_result
代码解释
- 生成学年周期表:基于原始数据的时间范围扩展出所有待判断的学年周期,覆盖完整与非完整年度。
- 非等连接匹配:用
data.table的区间匹配逻辑,将原始时段与学年周期关联,确保所有重叠时段都被纳入计算。 - 聚合判断条件:按
ID和YEAR聚合后,同时满足三个条件才判定为全效年度:- 周期内所有匹配时段的
VALID均为TRUE - 周期起始点被有效数据完全覆盖
- 周期结束点被有效数据完全覆盖
- 周期内所有匹配时段的
内容的提问来源于stack exchange,提问作者mnist
相关产品推荐
相关产品推荐

