【问题标题】:Merge two datasets based on date ranges. R根据日期范围合并两个数据集。 R
【发布时间】:2021-08-06 21:02:55
【问题描述】:

我的目标是使用日期范围合并两个数据集。 Dataset1 包含在医院加班的患者。 Dataset2 包含超时的房间信息。我的目标是确定我的 Dataset1 中住宿的房间类型。由于某些住院的房间类型可能会发生变化,因此情况可能会变得复杂。例如,第 101 名患者的第二次住院部分是 ICU,部分是急诊。

数据集 1

  PatientID Hospital Room           StartDate             EndDate
1       101     ODCC  4SW 2020-06-04 16:21:47 2020-06-22 15:12:39
2       101     ODCC   1W 2020-06-22 15:12:40 2020-09-08 14:03:34
3       101     ODCC   1N 2020-09-08 14:03:35 2020-10-02 06:50:24
4       101     ODCC   1W 2020-10-02 06:50:25 2020-10-05 14:25:54 

数据集 2

  Hospital Room      Type    StartDT      EndDT
1     ODCC  11A     Other 2020-01-01 2021-05-12
2     ODCC   1W       ICU 2020-06-01 2020-07-30
3     ODCC   1W Emergency 2020-08-01 2021-05-12
4     ODCC   1N Emergency 2020-11-05 2021-02-07

我的目标

  Patient.ID Hospital Room           StartDate             EndDate      Type    StartDT      EndDT
1        101     ODCC  4SW 2020-06-04 16:21:47 2020-06-22 15:12:39      <NA>       <NA>       <NA>
2        101     ODCC   1W 2020-06-22 15:12:40 2020-09-08 14:03:34       ICU 2020-06-01 2020-07-30
3        102     ODCC   1W 2020-06-22 15:12:40 2020-09-08 14:03:34 Emergency 2020-08-01 2021-05-12
4        101     ODCC   1N 2020-09-08 14:03:35 2020-10-02 06:50:24      <NA>       <NA>       <NA>
5        101     ODCC   1W 2020-10-02 06:50:25 2020-10-05 14:25:54 Emergency 2020-08-01 2021-05-12

您可以在下面找到复制我的数据集的代码。

stays <- structure(list(
  PatientID = c(101, 101, 101, 101),
  Hospital = c("ODCC", "ODCC", "ODCC", "ODCC"),
  Room = c("4SW", "1W", "1N", "1W"), 
  StartDate = structure(c(1591287707, 1592838760, 1599573815, 1601621425),
                        class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
  EndDate = structure(c(1592838759, 1599573814, 1601621424, 1601907954), 
                      class = c("POSIXct", "POSIXt"), tzone = "UTC")),
  class = "data.frame", row.names = c(NA, -4L))

type <- structure(list(
  Hospital = c("ODCC", "ODCC", "ODCC", "ODCC"), 
  Room = c("11A", "1W", "1W", "1N"), Type = c("Other", "ICU", "Emergency",
                                              "Emergency"), 
  StartDT = structure(c(1577836800, 1590969600, 1596240000, 1604534400), 
                      class = c("POSIXct", "POSIXt"), tzone = "UTC"),
  EndDT = structure(c(1620777600, 1596067200, 1620777600, 1612656000),
                    class = c("POSIXct","POSIXt"), tzone = "UTC")), 
  class = "data.frame", row.names = c(NA, -4L))

谢谢! 马文

【问题讨论】:

    标签: r join merge data.table date-range


    【解决方案1】:

    你可以使用foverlaps:

    library(data.table)
    setDT(stays)
    setDT(type)
    setkey(type,Room,StartDT,EndDT)
    foverlaps(stays,type,
              by.x=c("Room","StartDate","EndDate"),
              by.y=c("Room","StartDT","EndDT"),type="any")[
              ,.(
                PatientID,
                Hospital,
                Room,
                StartDate,
                EndDate,
                Type,
                StartDT,
                EndDT) ]      
    
       PatientID Hospital Room           StartDate             EndDate      Type    StartDT      EndDT
    1:       101     <NA>   1N 2020-09-08 14:03:35 2020-10-02 06:50:24      <NA>       <NA>       <NA>
    2:       101     ODCC   1W 2020-06-22 15:12:40 2020-09-08 14:03:34       ICU 2020-06-01 2020-07-30
    3:       101     ODCC   1W 2020-06-22 15:12:40 2020-09-08 14:03:34 Emergency 2020-08-01 2021-05-12
    4:       101     ODCC   1W 2020-10-02 06:50:25 2020-10-05 14:25:54 Emergency 2020-08-01 2021-05-12
    5:       101     <NA>  4SW 2020-06-04 16:21:47 2020-06-22 15:12:39      <NA>       <NA>       <NA>
    

    【讨论】:

    • 我收到以下错误:as.POSIXct.default(time1) 中的错误:不知道如何将“time1”转换为“POSIXct”类。它与我的类型数据的日期格式有关吗?你有同样的错误吗?谢谢!
    • 因为你在标签中有data.table,我忘了用library(data.table) 开始我的回答(见我的编辑)。然后代码在我的系统上没有问题。您是否收到示例数据集或更多数据的错误?
    • 我重新安装了 data.table 包,它现在可以工作了。我将更详细地探索 forlaps 以了解代码在做什么。由于某些 Startdates 大于 Enddates,因此我的真实数据集出现了一些问题。我会解决这个问题,代码应该可以工作。非常感谢,太好了!
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2016-12-27
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多