根据唯一日期计算未结案件和过去的事件

问题描述 投票:0回答:0

我有一个包含变量 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')
)

我有创建三个新变量的代码:

  1. 每个人的相关未决案例数,即 StartDates 在当前案例的 StartDate 之前和 EndDates 在当前 StartDate 或之后的相关案例数。

“相关案例”是指我只想计算 RelevantCase==1 的观察结果。

  1. 在当前 StartDate 的最后两年内开始的每个人的相关未决案例数。因此,这与第一个新变量相同,但它不会计算 StartDates 比当前 StartDate 早两年以上的相关开放案例。

  2. 在当前事件之前三年或更短时间内发生的过去相关事件的计数。

这段代码实现了:

### 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较晚的情况。

r date dplyr slider mutate
© www.soinside.com 2019 - 2024. All rights reserved.