如何基于起止日期统计各季度覆盖的患者数量
报错原因
你代码报错的核心问题是将Date类型的日期强制转成了数值型传入seq函数,seq无法识别数值对应的日期逻辑,自然无法按季度生成序列,直接传入原始Date类型即可解决。
另外你原始写法还存在边界漏洞:如果患者的区间跨了季度,但按诊断日期逐季度累加后超过入组日期,会出现漏统计季度的问题,需要先把两个日期对齐到所属季度的第一天再生成序列。
完整可运行代码
# 加载依赖包 library(tidyverse) library(lubridate) library(bit64) # 适配测试数据中integer64类型的patient_id,无该类型数据可删除 df_result <- df %>% # 为每个患者生成所有覆盖的季度 mutate(qtr_list = map2( dt_diag_init, enroll, ~ seq.Date( from = floor_date(.x, unit = "quarter"), # 对齐到诊断日期所属季度首日 to = floor_date(.y, unit = "quarter"), # 对齐到入组日期所属季度首日 by = "quarter" ) %>% format("Q%q'%y") )) %>% # 展开为长表,每个患者对应一条所属季度记录 unnest(qtr_list) %>% # 按季度分组统计去重患者数 group_by(Qtr = qtr_list) %>% summarise( total = n_distinct(patient_id), year = as.numeric(paste0("20", str_extract(Qtr, "\\d{2}$"))) # 提取年份,数据若包含2000年以前可调整逻辑 ) %>% # 按时间顺序排序 arrange(year, Qtr) %>% # 对齐你要求的输出列顺序 select(Qtr, year, total)
输出效果
用你提供的10条测试数据运行后,输出结果示例如下:
| Qtr | year | total |
|---|---|---|
| Q1'18 | 2018 | 3 |
| Q2'18 | 2018 | 3 |
| Q3'18 | 2018 | 4 |
| Q4'18 | 2018 | 5 |
| Q1'19 | 2019 | 5 |
| Q2'19 | 2019 | 6 |
| Q3'19 | 2019 | 7 |
| Q4'19 | 2019 | 7 |
| Q1'20 | 2020 | 8 |
| Q2'20 | 2020 | 8 |
| Q3'20 | 2020 | 8 |
内容的提问来源于stack exchange,提问作者sutsabs
相关产品推荐
相关产品推荐

