【发布时间】:2021-06-21 16:40:30
【问题描述】:
我希望找到 >=4 个在 90 天内发生在一个组内的唯一事件,然后标记 ID。
只是一个测试示例:
library(dplyr)
set.seed(1)
test <- data.frame(
PATID = sample(1:1e4, 1e5, replace = TRUE),
PROV = sample(1:50, 1e5, replace = TRUE),
GROUP = sample(0:1, 1e5, replace = TRUE),
DATE = as.Date(sample(
as.Date("2020-01-01"):as.Date("2020-12-31"),
1e5,
replace = TRUE
), origin = "1970-01-01")
)
如果我们查看PATID==5,我们可以看到有 4 个独特的 PROVs,它们在 90 天内的重叠日期在我们的兴趣组内,因此应该被标记。
> test %>% filter(PATID==5) %>% arrange(GROUP,DATE)
PATID PROV GROUP DATE
1 5 2 0 2020-05-07
2 5 3 0 2020-05-20
3 5 3 0 2020-11-15
4 5 49 0 2020-12-14
5 5 45 1 2020-02-16
6 5 50 1 2020-03-19
7 5 38 1 2020-03-25
8 5 27 1 2020-03-29
9 5 42 1 2020-08-30
10 5 46 1 2020-11-03
11 5 25 1 2020-11-13
12 5 29 1 2020-12-26
> as.Date("2020-03-29")-as.Date("2020-02-16")<=90
[1] TRUE
最终,我正在寻找 90 天内 GROUP==1 与 GROUP==0 与 >=4 唯一 PROVs 的比例。理想情况下,由于数据的规模,我更喜欢使用 data.table。
尝试一些代码:
test %>%
filter(PATID %in% 1:5) %>%
group_by(PATID,GROUP) %>%
arrange(GROUP, DATE) %>%
mutate(lag = DATE - lag(DATE),
day_count = case_when(lag <= 90 ~ TRUE,
is.na(lag) ~ TRUE,
TRUE ~ FALSE)) %>%
mutate(crit = cumsum_reset(day_count)) %>%
ungroup() %>%
group_by(PATID) %>%
mutate(flag = case_when(max(crit) >= 4 ~ 1,
TRUE ~ 0)) %>%
arrange(PATID)
越来越近了,只需要理清90的窗口而不是粗略地测试每个日期是否在90天内。
【问题讨论】:
-
是的,根据 PATID。
-
好吧,标志(如果这是最好的系统)将在 PATID 级别。不过,该比例将是符合和不符合标准的 PATID 的总和。
-
90d 窗口重叠的情况呢?你还能重复使用第一个窗口中的 PROV 吗?
标签: r dplyr data.table