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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:48:27