将间隔与R中的事件匹配

bjp0bcyl  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(102)

我有一个事件表和一组时间间隔,我想为每个事件关联一个布尔值,即设置为T表示事件在时间间隔内。
我的输入:

intervals:
begin                      end
2015-03-01 14:02:00        2015-03-01 14:09:00
2015-03-01 15:13:00        2015-03-01 15:54:00
2015-03-01 16:02:00        2015-03-01 19:09:00

events:
id           date
1            2015-03-01 14:01:00
2            2015-03-01 14:03:00
3            2015-03-01 14:07:00
4            2015-03-01 15:55:00
5            2015-03-01 17:02:00

我的输出将是:

id           inInterval
1            F
2            T
3            T
4            F
5            T

我有数百万个事件和数万个间隔,出于性能原因,我不想在事件上循环,也不想处理每个间隔的所有事件。
我可以很容易地做的是得到有序的数据。事件和间隔开始/结束表:

events:
id           date                     start       end
1            2015-03-01 14:01:00      
NA           2015-03-01 14:02:00      T
2            2015-03-01 14:03:00
3            2015-03-01 14:07:00
NA           2015-03-01 14:09:00                  T
NA           2015-03-01 15:13:00      T
NA           2015-03-01 15:54:00                  T
4            2015-03-01 15:55:00
NA           2015-03-01 16:02:00      T
5            2015-03-01 17:02:00
NA           2015-03-01 19:09:00                  T

现在我被最后一部分卡住了:为start=T和end=T之间的所有行设置inInterval=T。这显然需要某种延迟,但我缺少所需的特性。
任何帮助都将不胜感激。谢谢

编辑:这个现有问题似乎提供了一些见解:What is an efficient method for partitioning and aggregating intervals from timestamped rows in a data frame?这是我发表问题时建议的,基本上findInterval应该能帮我解决问题。

xt0899hw

xt0899hw1#

我的新想法是以R为基的(假设区间表是有序的,并且没有重叠的区间):

pint <- as.POSIXct(as.vector(t(intervals)))
results <- data.frame(
            id = events$id,
            inInterval = findInterval( as.POSIXct(events$date), pint) %% 2 != 0
         )

给出:

id inInterval
1  1      FALSE
2  2       TRUE
3  3       TRUE
4  4      FALSE
5  5       TRUE

findInterval返回找到的区间中的索引:

  • 如果是奇数,则在真实的区间中,返回TRUE
  • 如果是偶数,则超出真实的区间。返回FALSE
8fsztsew

8fsztsew2#

对于ivsiv_between()

library(ivs)
library(dplyr, warn.conflicts = FALSE)

intervals <- tibble(
  begin = c(
    "2015-03-01 14:02:00",
    "2015-03-01 15:13:00",
    "2015-03-01 16:02:00"
  ),
  end = c(
    "2015-03-01 14:09:00",
    "2015-03-01 15:54:00",
    "2015-03-01 19:09:00"
  )
)

intervals <- intervals %>%
  mutate(
    begin = as.POSIXct(begin, tz = "UTC"),
    end = as.POSIXct(end, tz = "UTC")
  ) %>%
  mutate(
    range = iv(begin, end),
    .keep = "unused"
  )

events <- tibble(
  id = 1:5,
  date = c(
    "2015-03-01 14:01:00",
    "2015-03-01 14:03:00",
    "2015-03-01 14:07:00",
    "2015-03-01 15:55:00",
    "2015-03-01 17:02:00"
  )
)

events <- events %>%
  mutate(date = as.POSIXct(date, tz = "UTC"))

intervals
#> # A tibble: 3 × 1
#>                                        range
#>                                   <iv<dttm>>
#> 1 [2015-03-01 14:02:00, 2015-03-01 14:09:00)
#> 2 [2015-03-01 15:13:00, 2015-03-01 15:54:00)
#> 3 [2015-03-01 16:02:00, 2015-03-01 19:09:00)

events %>%
  mutate(in_interval = iv_between(date, intervals$range))
#> # A tibble: 5 × 3
#>      id date                in_interval
#>   <int> <dttm>              <lgl>      
#> 1     1 2015-03-01 14:01:00 FALSE      
#> 2     2 2015-03-01 14:03:00 TRUE       
#> 3     3 2015-03-01 14:07:00 TRUE       
#> 4     4 2015-03-01 15:55:00 FALSE      
#> 5     5 2015-03-01 17:02:00 TRUE

相关问题