我需要一个变量“minus_180_days”/(counter) 以升序编号:
第一次访问时,
如果第二次过去的时间少于 180 天(与患者的前一次就诊相比);如果不满足 180 天标准,则第二次访问时也必须出现 1;
如果在第三次访问中与前一次访问的时间少于 180 天(访问“2”),如果未满足 180 天的标准,则在第三次访问中为 1,等等
数据
pacient <- c(10,10,10,10,10,11,11,12,12,12,13, 13, 15, 14); pacient
date <- as.Date(c("01/01/2018","02/05/2018", "04/06/2018", "10/11/2019", "05/12/2018", "02/01/2018", "06/08/2018", "01/01/2018", "03/01/2018", "06/03/2018", "05/08/2018", "05/08/2019", "05/07/2019", "08/07/2017"), format = "%d/%m/%Y"); date
DF <- data.frame(pacient, date); DF
我有这个代码
DF <- DF %>%
group_by(pacient) %>%
arrange(date) %>%
mutate(days_visit = date - lag(date, default = first(date)))
days_visit <- as.integer(DF$days_visit)
DF <- DF[with(DF,order(pacient,date)),]
最佳答案
一个 dplyr 解决方案,已更新以反射(reflect) @Gregor 的有用评论:
DF2 <- DF %>%
group_by(pacient) %>%
arrange(pacient, date) %>%
mutate(days_visit = (date - lag(date, default = first(date))) %>% as.integer,
new_count = cumsum(days_visit > 180) + 1) %>%
group_by(pacient, new_count) %>%
mutate(vis_num = row_number(),
counter = case_when(vis_num == 1 ~ 1L,
days_visit < 180 ~ vis_num,
TRUE ~ 1L))
> DF
# A tibble: 14 x 5
# Groups: pacient [6]
pacient date days_visit vis_num counter
<dbl> <date> <int> <int> <int>
1 10 2018-01-01 0 1 1
2 10 2018-05-02 121 2 2
3 10 2018-06-04 33 3 3
4 10 2018-12-05 184 4 1
5 10 2019-11-10 340 5 1
6 11 2018-01-02 0 1 1
7 11 2018-08-06 216 2 1
8 12 2018-01-01 0 1 1
9 12 2018-01-03 2 2 2
10 12 2018-03-06 62 3 3
11 13 2018-08-05 0 1 1
12 13 2019-08-05 365 2 1
13 14 2017-07-08 0 1 1
14 15 2019-07-05 0 1 1
关于R:带条件的向上计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55541602/