如何填补缺失的时间间隔
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
我有一个数据框,其中包含在不同时间间隔进行的测量:
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