对跨越午夜的时间段进行概率关联的阻塞

问题描述 投票:0回答:1

我正在尝试使用 R 中的 reclin2 包根据事件时间链接 2 个医疗保健数据集。因为时间没有准确记录在两个数据集中,所以我必须使用时间间隔,但这会导致问题与 recline2::pair_blocking() 一起使用,因为它不会基于 %within% 关系创建对。另外,因为数据有时会跨越午夜,所以我不能只使用日期。

不幸的是,由于数据质量差,无法通过其他数据(性别、年龄等)点进行匹配。

每个实际数据集都有超过 30 000 个案例,其中一些案例没有配对,因此解决方案需要高效地提高 CPU 使用率。

下面是一个示例问题集,其中 X 中的情况 1 应与 Y 中的情况 1 配对,X 中的情况 2 应与 Y 中的情况 2 配对,....

library(lubridate)
#Dataset X
case.x<- c(1,2,3,4) 
Event_time<- c("1/2/23 14:56:00", "4/5/23 23:56:00", "7/6/23 00:42:00", "2/5/23 05:06:00")
Location<- c( "A", "B", "A", "B")
X<- data.frame(case.x,Event_time, Location)
X$Event_time<-dmy_hms(Event_time)

#Dataset Y
case.y<- c(1,2,3,4) 
event_range_start<- c("1/2/23 13:56:00", "4/5/23 22:56:00", "6/6/23 23:42:00", "2/5/23 04:06:00")
event_range_end<- c("1/2/23 15:56:00", "5/5/23 00:56:00", "7/6/23 01:42:00", "2/5/23 06:06:00")
Location<- Location<- c( "A", "B", "A", "B")
Y<- data.frame(case.y,event_range_start,event_range_end, Location)
Y$event_range<- interval(dmy_hms(Y$event_range_start), dmy_hms(Y$event_range_end))

我正在寻找基于时间范围的阻塞对问题的解决方案,最好使用reclin2,但如果需要,可以考虑其他概率链接包。

r lubridate
1个回答
0
投票

这是一种基于您提供的信息的方法。请注意,我已经修改了 Y 中的最后一个 event_range_end 值以显示它的工作原理:

library(lubridate)
library(dplyr)

#Dataset X
case.x<- c(1,2,3,4) 
Event_time <- c("1/2/23 14:56:00",
                "4/5/23 23:56:00",
                "7/6/23 00:42:00",
                "2/5/23 05:06:00")
Location <- c( "A", "B", "A", "B")
X <- data.frame(case.x, Event_time, Location)
X$Event_time <- dmy_hms(Event_time)

#Dataset Y
case.y<- c(1,2,3,4) 
event_range_start <- c("1/2/23 13:56:00",
                       "4/5/23 22:56:00",
                       "6/6/23 23:42:00",
                       "2/5/23 04:06:00")
event_range_end <- c("1/2/23 15:56:00",
                     "5/5/23 00:56:00",
                     "7/6/23 01:42:00",
                     "2/5/23 05:05:00") 
Location <- Location<- c( "A", "B", "A", "B")

Y <- data.frame(case.y, event_range_start, event_range_end, Location)
Y$event_range_start <- dmy_hms(Y$event_range_start)
Y$event_range_end <- dmy_hms(Y$event_range_end)

# Join X and Y and filter based on event range columns
df <- X %>%
  left_join(Y, by = join_by(case.x == case.y),
            suffix = c("", ".y")) %>%
  filter(Event_time >= event_range_start &
           Event_time <= event_range_end) %>%
  select(-ends_with(".y"))

df
  case.x          Event_time Location   event_range_start     event_range_end
1      1 2023-02-01 14:56:00        A 2023-02-01 13:56:00 2023-02-01 15:56:00
2      2 2023-05-04 23:56:00        B 2023-05-04 22:56:00 2023-05-05 00:56:00
3      3 2023-06-07 00:42:00        A 2023-06-06 23:42:00 2023-06-07 01:42:00
© www.soinside.com 2019 - 2024. All rights reserved.