R(dplyr): find all rows in row-specific range

标签 r dplyr date-range

我有一个数据集,其中每一行都由住院 ID 标识。每行包含有关住院 ID、发生医院 ID 以及给定住院的入院日期和出院日期的信息。

我想知道,对于每次住院治疗,在该次住院治疗开始前 30 天内在指定医院完成的所有其他住院治疗的 ID。

下面是 2 家医院发生 6 次住院的简单示例。

library("tidyverse")

df <- data.frame(hospitalization_id = c(1, 2, 3, 
                                        4, 5, 6),
                 hospital_id = c("A", "A", "A", 
                                 "B", "B", "B"),
                 date_start = as.Date(c("2000-01-01", "2000-01-12", "2000-01-20",
                                        "2000-02-10", "2000-02-12", "2000-02-12")),
                 date_end = as.Date(c("2000-01-03", "2000-01-18", "2000-01-22",
                                      "2000-02-11", "2000-02-14", "2000-01-17")))

我在每次住院开始前的 30 天间隔内创建了日期。

df_with_date_range <- df %>%
  mutate(date_range1 = date_start - 31,
         date_range2 = date_start - 1)

我正在尝试编写一个代码,添加一个列,其中包含在此 30 天间隔范围内发生的所有住院治疗。我想要的输出如下:

df_final <- df_with_date_range %>%
  filter(hospitalization_id == 3) %>%
  bind_rows(df_with_date_range) %>%
  arrange(hospitalization_id) %>%
  mutate(hospitalization_id_in_range = c(NA, 1, 1, 2, NA, 4, 4))

在医院A:

  • 住院前 30 天内没有住院1
  • 住院 1 发生在住院 2 之前 30 天内
  • 住院 1 和 2 发生在住院 3 之前的 30 天内

在B医院:

  • 住院前30天内没有住院4
  • 住院 4 发生在住院 5 之前 30 天内
  • 住院 4 发生在住院 6 之前 30 天内

最佳答案

使用data.table:

library(data.table)

setDT(df)
df[,from:=date_start-30]

df[df,.(hospital_id,
        hospitalization_id = i.hospitalization_id, 
        date_start = i.date_start,
        date_end = i.date_end,
        prev_hospitalization_id = x.hospitalization_id,
        prev_date_start = x.date_start),
      on=.(hospital_id,date_start>=from,date_start<date_start)]

   hospital_id hospitalization_id date_start   date_end prev_hospitalization_id prev_date_start
        <char>              <num>     <Date>     <Date>                   <num>          <Date>
1:           A                  1 2000-01-01 2000-01-03                      NA            <NA>
2:           A                  2 2000-01-12 2000-01-18                       1      2000-01-01
3:           A                  3 2000-01-20 2000-01-22                       1      2000-01-01
4:           A                  3 2000-01-20 2000-01-22                       2      2000-01-12
5:           B                  4 2000-02-10 2000-02-11                      NA            <NA>
6:           B                  5 2000-02-12 2000-02-14                       4      2000-02-10
7:           B                  6 2000-02-12 2000-01-17                       4      2000-02-10

xi 前缀是指特定于 data.table< 的 X[i,j,by] 语法
这意味着在上面的示例中,x 是外部 dfi 是内部 df

关于R(dplyr): find all rows in row-specific range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73362767/

相关文章:

r - 如何获得频率滞后周期的平均值作为r中的新变量

mysql - 设计不重叠的日期时间事件

r - hist 函数将 "zero"和 "1"值聚合到一个 bin 中。

r - 设置 ggplot 标题以反射(reflect) dplyr 分组

r - 为 df 创建组索引

javascript - JQuery Daterangepicker onchange 事件

javascript - 如何设置日期 slider 所选范围的最小值?

r - 在使用 roxygen2 的文档中找不到数据

r - 通过 apply R 使用模拟

sql - 使用 dbplyr 生成 CROSS JOIN 查询