我有一个数据集,其中每一行都由住院 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
x
和 i
前缀是指特定于 data.table< 的
。X[i,j,by]
语法
这意味着在上面的示例中,x
是外部 df
,i
是内部 df
。
关于R(dplyr): find all rows in row-specific range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73362767/