R语言基于日期实现Inv字段带扣减的滚动累计计算
R语言实现Inv字段滚动累计余额计算
问题说明
- 原始数据框
df1包含ID、Date、Inv、Inved4个字段,为ID=XYZ1的逐日业务数据,其中Inv为当日新增待处理量,Inved为当日完成处理量。 - 计算目标:生成带滚动累计待处理Inv余额的结果表
df2,计算规则:- 当日新增Inv与当日完成Inved量相等时,当日无剩余待处理Inv
- 当日无新增完成量(Inved=0)时,当日新增Inv直接累加到历史待处理余额
- 当日有新增完成量时,完成量增量从历史待处理余额中扣除
- 待处理余额最小为0,不可能出现负数
注:原始提供的数据构造代码中Date字段未加引号,会被R识别为算术运算(如
2021-04-01实际计算结果为2016),使用时需要修正为标准日期格式。
计算逻辑本质
滚动待处理余额 = max(0, 截至当日累计新增Inv总量 - 截至当日累计完成Inved总量)
该公式完全覆盖梳理的全部规则:
- 当日新增Inv等于当日Inved时,累计Inv和累计Inved增量相等,余额与上一日一致,若上一日余额为0则当日余额为0
- Inved无变动时,累计Inved不变,当日新增Inv直接累加至余额
- Inved增长时,累计Inved同步增加,增量直接从余额中扣除
可复现代码
修正后的原始数据构造
library(dplyr) df1 <- data.frame( ID = rep('XYZ1', 14), Date = as.Date(c('2021-04-01', '2021-04-02', '2021-04-03', '2021-04-04', '2021-04-05', '2021-04-06', '2021-04-07', '2021-04-08', '2021-04-09', '2021-04-10', '2021-04-11', '2021-04-12', '2021-04-13', '2021-04-14')), Inv = c(0,9,0,15,0,7,0,0,12,18,0,12,18,0), Inved = c(0,9,0,0,0,4,0,5,0,0,0,10,0,5) )
滚动累计计算实现
单ID数据可直接计算,多ID数据按ID分组排序后计算即可兼容批量场景:
df2 <- df1 %>% # 多ID场景需先按ID、日期排序,保证计算顺序正确 arrange(ID, Date) %>% group_by(ID) %>% mutate( # 计算累计新增、累计完成值 cum_inv = cumsum(Inv), cum_inved = cumsum(Inved), # 计算待处理余额,拦截负值场景 inv_balance = pmax(0, cum_inv - cum_inved) ) %>% ungroup() # 查看计算结果 print(df2)
结果校验
计算得到的inv_balance序列为:0, 0, 0, 15, 15, 18, 18, 13, 25, 43, 43, 45, 63, 58,完全符合规则要求:
- 4月2日:新增Inv9、完成9,余额0
- 4月4日:新增Inv15、无完成,累计余额15
- 4月6日:新增Inv7、完成4,余额15+7-4=18
- 4月8日:无新增Inv、完成5,余额18-5=13
- 后续日期计算逻辑一致,结果完全匹配预期。
内容的提问来源于stack exchange,提问作者user17582908
相关产品推荐
相关产品推荐

