首页 文章

dplyr或data.table来计算R中的时间序列聚合

提问于
浏览
0

我正在尝试总结包含日期(或时间)信息的 data.frame .

让我们假设这个包含患者的住院记录:

df <- data.frame(c(1, 2, 1, 1, 2, 2),
             c(as.Date("2013/10/15"), as.Date("2014/10/15"), as.Date("2015/7/16"), as.Date("2016/1/7"), as.Date("2015/12/20"), as.Date("2015/12/25")))
names(df) <- c("patient.id", "hospitalization.date")

df 看起来像这样:

> df
      patient.id hospitalization.date
    1          1           2013-10-15
    2          2           2014-10-15
    3          1           2015-07-16
    4          1           2016-01-07
    5          2           2015-12-20
    6          2           2015-12-25

对于每次观察,我需要计算在住院前365天内发生的住院次数 .

在我的例子中,它将是新的 df$hospitalizations.last.year 列 .

> df
      patient.id hospitalization.date hospitalizations.last.year
    1          1           2013-10-15                          1
    2          2           2014-10-15                          1
    3          1           2015-07-16                          1
    4          2           2015-12-20                          1
    5          2           2015-12-25                          2
    6          1           2016-01-07                          2
    7          2           2016-02-10                          3

请注意,计数器包括过去365天中的先前记录数,而不仅仅是当前年份 .

我正在尝试使用 dplyrdata.table 这样做,因为我的数据集非常庞大且性能很重要 . 可能吗?

1 回答

  • 2

    自版本1.9.8(在CRAN 2016年11月25日), data.table 提供非equi连接:

    library(data.table)
    # coerce to data.table
    setDT(df)[
      # create helper column
      , date_365 := hospitalization.date - 365][
        # step1: non-equi self-join
        df, on = c("patient.id", "hospitalization.date>=date_365", 
                   "hospitalization.date<=hospitalization.date")][
          # step 2: count hospitalizations.last.year for each patient
          , .(hospitalizations.last.year = .N), 
          by = .(patient.id, hospitalization.date = hospitalization.date.1)]
    

    patient.id住院治疗 . 住院治疗 . 住院
    1:1 2013-10-15 1
    2:2 2014-10-15 1
    2015-07-16 3:1 1
    2015年1月2日4:2 1
    2015-12-25 5:2 2
    6:1 2016-01-07 2
    7:2 2016-02-10 3


    Edit: 加入和聚合可以一步完成:

    # coerce to data.table
    setDT(df)[
      # create helper column
      , date_365 := hospitalization.date - 365][
        # non-equi self-join
        df, on = c("patient.id", "hospitalization.date>=date_365", 
                   "hospitalization.date<=hospitalization.date"), 
        # count hospitalizations.last.year grouped by join parameters
        .(hospitalizations.last.year = .N), by = .EACHI][
          # remove duplicate column
          , hospitalization.date := NULL][]
    

    结果与上述相同 .

    数据

    OP提供了两个数据集,分别为6行和7行 . 这里使用了7行的数据集,因为它是作为预期结果发布的:

    df <- data.frame(
      patient.id = c(1L, 2L, 1L, 1L, 2L, 2L, 2L),
      hospitalization.date = as.Date(c("2013/10/15", "2014/10/15", "2015/7/16", 
                                       "2016/1/7", "2015/12/20", "2015/12/25", "2016/2/10")))
    df <- df[order(df$hospitalization.date), ]
    

相关问题