我有一个包含变量 Person、RelevantCase、StartDate 和 EndDate 的数据框:
df <- data.frame(Person = c('111','334','334','334','334','334','888','888','888','888','888','888','888','888','888','888'),
RelevantCase = c(0,1,1,0,1,0,1,1,1,0,0,1,0,1,1,1),
StartDate = c('2017-03-04','2015-11-14','2018-04-26','2020-01-24','2020-01-25','2020-02-29','2015-08-09',
'2015-08-09','2018-04-10','2019-09-20','2020-06-30','2020-11-01','2021-08-13','2022-11-11',
'2022-11-11','2022-11-12'),
EndDate = c('2017-12-12','2022-01-25','2020-03-01','2021-02-24','2020-01-30','2022-02-02','2019-10-20',
'2019-10-30','2018-10-10','2021-10-10','2020-07-20','2022-11-20','2021-11-12','2023-01-01',
'2022-12-12','2022-12-12')
)
我有创建三个新变量的代码:
“相关案例”是指我只想计算 RelevantCase==1 的观察结果。
在当前 StartDate 的最后两年内开始的每个人的相关未决案例数。因此,这与第一个新变量相同,但它不会计算 StartDates 比当前 StartDate 早两年以上的相关开放案例。
在当前事件之前三年或更短时间内发生的过去相关事件的计数。
这段代码实现了:
### open cases
df <- df %>%
mutate(StartDate = as.Date(StartDate),
EndDate = as.Date(EndDate)) %>%
arrange(Person, StartDate, EndDate) %>%
dplyr::group_by(Person) %>%
mutate(NumberOpenCases = map_int(StartDate, ~sum(StartDate < .x &
EndDate >= .x &
RelevantCase == 1)),
NumberOpenCases_2y = map_int(StartDate, ~sum(StartDate < .x &
EndDate >= .x &
RelevantCase == 1 &
.x - StartDate < 730)))
### past relevant events
df <- df %>%
mutate(StartDate = ymd(StartDate)) %>%
dplyr::group_by(Person) %>%
arrange(Person, StartDate) %>% # slider unfortunately requires dates be sorted
mutate(no_shows_past3yr = slider::slide_index_dbl(
RelevantCase, StartDate, sum, .before = days(365*3), .after = days(-1)
))
但是,我只想根据 unique StartDates 进行计数(即,如果有两种情况具有真正相同的 StartDates,我只想将其计为一个)。最重要的是,对于未结案件,我想用较晚的 EndDate 来计算案件。
因此在第 16 行中,列 NumberOpenCases==3 但它应该等于 2,因为第 14 行和第 15 行中的开始日期相同。同样,列 NumberOpenCases_2y==2 但出于同样的原因它应该等于 1。
而在第9行,第no_shows_past3yr==2列,但它应该等于1,因为第7行和第8行的StartDates是相同的,所以应该只计算EndDate较晚的情况。