【问题标题】:How to fill missing time intervals如何填补缺失的时间间隔
【发布时间】:2021-03-03 11:41:02
【问题描述】:

我有一个以不同时间间隔进行测量的数据框:

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

【问题讨论】:

    标签: r dplyr intervals


    【解决方案1】:

    你可以使用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   
    

    【讨论】:

      【解决方案2】:
      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 年 3 月 3 日创建

      【讨论】:

        猜你喜欢
        • 2017-05-06
        • 2018-12-22
        • 2020-06-18
        • 2020-03-19
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 2021-03-23
        相关资源
        最近更新 更多