如何为分组tsibble按组填充指定时间范围的缺失间隔
按组自定义起止时间填充tsibble的缺失时间间隔
问题核心
处理多分组的tsibble时,若每个分组有独立的时间起止范围,直接将起止时间列传入fill_gaps()的.start/.end参数会报错——因为这两个参数仅支持标量值,无法识别分组内的列变量。需要实现按组自动读取起止时间,批量完成缺失间隔填充。
解决方案
利用group_modify()对每个分组单独执行fill_gaps(),在分组内提取起止时间的标量值传入参数,即可实现按组填充对应时间范围的缺失间隔。
完整代码示例
library(tidyverse) library(tsibble) N <- 10 set.seed(42) d <- as_datetime("2023-03-08 08:00:00") times <- d + seconds(unique(round(sort(runif(N, min = 0, max = 36e3))))) nObs <- 1 + rpois(length(times), lambda = 1) birdIdx <- 1 + round(runif(length(times))) birds <- c("Duck", "Goose")[birdIdx] waterfowl <- tibble(Timestamp = times, Count = nObs, Bird = as_factor(birds)) # 聚合为30分钟间隔的分组tsibble waterfowl |> as_tsibble(index = Timestamp) |> group_by(Bird) |> index_by(Interval = floor_date(Timestamp, "30 minute")) |> summarize(`Total birds` = sum(Count)) -> waterfowlSumm # 为每个分组添加自定义起止时间(实际场景可替换为按组计算的起止,比如min/max Timestamp) waterfowl_with_range <- waterfowlSumm |> mutate( Start = d, End = d + hours(9) + minutes(30) ) # 按组填充缺失间隔 waterfilled <- waterfowl_with_range |> group_modify(function(.x, .y) { fill_gaps( .x, `Total birds` = 0, .start = .x$Start[1], .end = .x$End[1] ) }) |> select(-Start, -End) # 按需保留或删除起止时间列 # 查看结果 waterfilled
关键说明
group_modify()会遍历每个分组,将分组数据(.x)和分组键(.y)传入自定义函数- 在分组函数内,通过
.x$Start[1]和.x$End[1]提取该分组的起止时间标量,满足fill_gaps()的参数要求 - 若起止时间是从原始数据按组计算(比如每个Bird的最早/最晚观测时间),可在添加起止列时用
mutate(Start = min(Timestamp), End = max(Timestamp))替换硬编码值
内容的提问来源于stack exchange,提问作者BestGirl
相关产品推荐
相关产品推荐

