【问题标题】:dplyr or data.table to calculate time series aggregations in Rdplyr 或 data.table 在 R 中计算时间序列聚合
【发布时间】:2016-06-03 23:28:29
【问题描述】:

我正在尝试总结一个包含日期(或时间)信息的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 来做到这一点,因为我的数据集非常庞大并且性能很重要。 ¿ 有可能吗?

【问题讨论】:

  • 按照这个逻辑,第三次观察不应该也算作“去年住院”吗?
  • 我正在尝试根据每个患者计算第三列 hospitalizations.last.year。所以对于第六排,患者 2 在 2014 年 12 月 25 日之后住院 2 次,2015 年 12 月 25 日和 2015 年 12 月 20 日住院一次。 2014 年 10 月 15 日的另一个在 365 天窗口之外。
  • 我还不清楚,抱歉。只是为了检查:对于每次观察,您要计算在那个住院之前的 365 天内发生的住院次数。 (感谢@docendodiscimus)
  • 是的,你明白了。那是我的问题。谢谢。
  • 似乎是一个标准的滚动连接问题,但你的最后一列对我来说毫无意义。为什么是例如当前住院日期不计入第一行,但计入最后一行..?

标签: r data.table time-series dplyr


【解决方案1】:

自 1.9.8 版(2016 年 11 月 25 日在 CRAN 上)以来,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 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

编辑:加入和聚合可以一步结合:

# 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), ]

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2020-03-26
    • 2014-09-14
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    相关资源
    最近更新 更多