按ID和类别分组的日期差累计求和需求
问题描述
我有一个按行存储日期的数据库,每行记录单个病例的一次入院日期(Admission Date)。每个病例拥有唯一ID,允许重复入院,同时存在类别变量(Cat)。我已按ID和类别对数据库排序,并计算了相邻两次入院的日期差(Date_diff),首次入院的Date_diff为NA。现需实现连续入院日期差的累计求和(Cum_Sum),以此查看时间跨度。
示例数据框
ID Admission Date Cat Date_diff Admission_Rank <dbl> <dttm> <dbl> <Period> 1326 2015-06-08 00:00:00 1 NA 1 1466 2017-11-27 00:00:00 1 NA 1 1656 2016-10-06 00:00:00 1 NA 1 1594 2015-04-20 00:00:00 2 NA 1 1347 2013-02-14 00:00:00 1 NA 1 1347 2013-03-18 00:00:00 1 32d 0H 0M 0S 2 1347 2013-04-03 00:00:00 1 16d 0H 0M 0S 3 1347 2013-08-15 00:00:00 1 134d 0H 0M 0S 4 1347 2014-05-16 00:00:00 1 274d 0H 0M 0S 5 1347 2014-05-16 00:00:00 1 0S 6
期望结果数据框
ID Admission Date Cat Date_diff Admission_Rank Cum_Sum 1326 2015-06-08 00:00:00 1 NA 1 NA 1466 2017-11-27 00:00:00 1 NA 1 NA 1656 2016-10-06 00:00:00 1 NA 1 NA 1594 2015-04-20 00:00:00 2 NA 1 NA 1347 2013-02-14 00:00:00 1 NA 1 NA 1347 2013-03-18 00:00:00 1 32d 0H 0M 0S 2 32d 0H 0M 0S 1347 2013-04-03 00:00:00 1 16d 0H 0M 0S 3 48d 0H 0M 0S 1347 2013-08-15 00:00:00 1 134d 0H 0M 0S 4 172d 0H 0M 0S 1347 2014-05-16 00:00:00 1 274d 0H 0M 0S 5 446d 0H 0M 0S 1347 2014-05-16 00:00:00 1 0S 6 446d 0H 0M 0S
解决方案
使用dplyr分组结合lubridate的日期类型支持,即可完成累计求和。核心逻辑是按ID和Cat分组,对Date_diff列执行累计求和操作,由于Date_diff的首个值为NA,累计求和后会自动保留该NA,后续值则依次累加:
library(dplyr) library(lubridate) # 假设你的数据框名为df df <- df %>% group_by(ID, Cat) %>% mutate(Cum_Sum = cumsum(Date_diff)) %>% ungroup()
这段代码会直接生成符合预期的Cum_Sum列:
- 每个病例的首次入院记录,
Cum_Sum保持为NA - 从第二次入院开始,
Cum_Sum为之前所有Date_diff的累加值 - 当
Date_diff为0S时,累加后值保持不变,与示例结果一致
内容的提问来源于stack exchange,提问作者Erdem Erkoyun
相关产品推荐
相关产品推荐

