R语言按日期区间匹配读数 重叠区间取日度平均值

R语言实现日度读数匹配(区间衔接点自动取均值)
实现思路
逻辑不需要复杂判断,兼容性强:
- 先拆分原始数据为两部分:有效区间表(过滤掉Start Date为空的无效行,保留起止日期、读数字段)、待计算日度日期表(提取所有非空的Daily Date)
- 对每一个日度日期,匹配所有满足
Start Date ≤ 当日日期 ≤ End Date的区间记录 - 对匹配到的所有Reading值求平均值:
- 日期落在单个区间内部时,只会匹配到1个Reading,平均值就是该读数本身
- 日期恰好处于两个区间衔接点时(既是前一区间结束日、也是后一区间开始日),会匹配到2个Reading,平均值自动为两个读数的均值
- 该逻辑兼容任意长度的读数周期,且不需要依赖
reading period字段,直接通过起止日期判断覆盖关系,可避免周期值记录错误导致的结果偏差。
完整代码
# 加载dplyr包做数据处理,第一次运行请先执行 install.packages("dplyr") library(dplyr) # 读取你的数据,这里直接用你提供的示例数据做演示 df <- structure(list(`Start Date` = structure(c(1193961600, 1194134400, 1194307200, 1194480000, NA, NA, NA, NA, NA, NA, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), `End Date` = structure(c(1194134400, 1194307200, 1194480000, 1194998400, NA, NA, NA, NA, NA, NA, NA ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Reading = c(3, 4, 3.5, 2, NA, NA, NA, NA, NA, NA, NA), `reading period` = c(2, 2, 2, 6, NA, NA, NA, NA, NA, NA, NA), `Daily Date` = structure(c(1194048000, 1194134400, 1194220800, 1194307200, 1194393600, 1194480000, 1194566400, 1194652800, 1194739200, 1194825600, 1194912000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), `Daily reading` = c(3, 3.5, 4, 3.75, 3.5, 2.75, 2, 2, 2, 2, 2)), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -11L)) # 提取有效区间数据 interval_df <- df %>% filter(!is.na(`Start Date`)) %>% select(`Start Date`, `End Date`, Reading) # 提取待计算的所有日度日期 daily_df <- df %>% filter(!is.na(`Daily Date`)) %>% select(`Daily Date`) # 逐行计算日度读数 result <- daily_df %>% rowwise() %>% mutate(`Daily reading` = mean( interval_df$Reading[ interval_df$`Start Date` <= `Daily Date` & interval_df$`End Date` >= `Daily Date` ] )) %>% ungroup() # 打印结果,可直接和示例的Daily reading列核对 print(result)
结果说明
运行代码后得到的结果和示例给出的预期值完全一致:
- 单区间覆盖的日期(如2007-11-02、2007-11-04等)直接返回对应区间的读数
- 区间衔接点日期(如2007-11-03、2007-11-05、2007-11-07)自动返回前后两个区间读数的平均值
- 长度为6天的长周期区间覆盖的所有内部日期,都正确返回对应读数2
内容的提问来源于stack exchange,提问作者user18029771
相关产品推荐
相关产品推荐

