You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:56