如何填补缺失的时间间隔

How to fill missing time intervals

我有一个数据框,其中包含在不同时间间隔进行的测量:

df <- data.frame(
  A_aoi = c("C", "C", "C", "B"),
  starttime_ms = c(49, 1981, 6847, 7180),
  endtime_ms = c(1981, 6115, 7048, 10080)
)

有时间隔是完全连续的,即下一次测量的 starttime_ms 先前测量的 endtime_ms。然而,更常见的是,间隔之间存在间隙。每当存在这样的差距时,我都需要将行汇集到 df 中;该行应说明该间隙何时开始以及何时结束。到目前为止,我最接近的解决方案是检测和测量间隙的持续时间:

library(dplyr)
df$gap <- ifelse(lag(df$starttime_ms,1) == df$endtime_ms, 
                  NA, 
                  lead(df$starttime_ms,1) - df$endtime_ms)

然而,这离 期望的输出还很远:

   A_aoi starttime_ms endtime_ms 
1     C           49        1981
2     C         1981        6115
3    NA         6115        6847
4     C         6847        7048
5    NA         7048        7180
6     B         7180       10080
df <- data.frame(
  A_aoi = c("C", "C", "C", "B"),
  starttime_ms = c(49, 1981, 6847, 7180),
  endtime_ms = c(1981, 6115, 7048, 10080)
)
df
#>   A_aoi starttime_ms endtime_ms
#> 1     C           49       1981
#> 2     C         1981       6115
#> 3     C         6847       7048
#> 4     B         7180      10080


x <- sort(unique(unlist(df[-1])))

df_int <- data.frame(starttime_ms = x[-length(x)], endtime_ms = x[-1])

library(tidyverse)
left_join(df_int, df, by = c("starttime_ms", "endtime_ms")) %>% 
  relocate(A_aoi, everything())
#>   A_aoi starttime_ms endtime_ms
#> 1     C           49       1981
#> 2     C         1981       6115
#> 3  <NA>         6115       6847
#> 4     C         6847       7048
#> 5  <NA>         7048       7180
#> 6     B         7180      10080

reprex package (v1.0.0)

于 2021-03-03 创建

您可以按如下方式使用 data.table 包:

library(data.table)

unq <- sort(unique(setDT(df)[, c(starttime_ms, endtime_ms)]))

df[.(unq[-length(unq)], unq[-1]), on=c("starttime_ms", "endtime_ms")]

# A_aoi starttime_ms endtime_ms     
#     C           49       1981    
#     C         1981       6115     
#  <NA>         6115       6847    
#     C         6847       7048   
#  <NA>         7048       7180    
#     B         7180      10080