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

基于data.table实现按客户计算当前余额与历史最大余额比值

用data.table实现按客户计算余额与历史最大余额的比值

没问题,这个需求用data.table的分组累计计算就能轻松搞定,核心就是按客户分组后,用累计最大值函数追踪历史最高余额,再做个除法就完事了。

先给你完整的R代码示例,直接就能跑:

library(data.table)

# 构造你给出的示例数据
dt <- data.table(
  customer_id = c(1, 1, 1, 1),
  month = c(1, 2, 3, 4),
  balance = c(100, 110, 140, 70)
)

# 核心处理逻辑:按客户分组,计算累计最大值+比值
dt[, `:=`(
  max_hist_balance = cummax(balance),
  ratio = balance / cummax(balance)
), by = customer_id]

# 把比值保留两位小数,和你要的输出格式对齐
dt[, ratio := round(ratio, 2)]

# 查看最终结果
print(dt)

运行后输出的结果完全符合你的需求:

customer_id month balance max_hist_balance ratio
1:           1     1     100              100  1.00
2:           1     2     110              110  1.10
3:           1     3     140              140  1.27
4:           1     4      70              140  0.50

关键逻辑拆解

  • by = customer_id:确保咱们是针对每个客户单独计算,不会把不同客户的余额数据混在一起;
  • cummax(balance):这就是你要的「截至当前行的历史最大余额」——它会从每个客户的第一行开始,逐行更新并记录到当前位置为止的最大值,完美匹配需求;
  • 最后用当前行的balance除以这个累计最大值得到ratio,再用round()调整小数位数,和示例输出对齐。

如果你习惯用dplyr的话,逻辑其实是一样的,给你补充个dplyr版本的代码:

library(dplyr)

dt %>%
  group_by(customer_id) %>%
  mutate(
    max_hist_balance = cummax(balance),
    ratio = round(balance / max_hist_balance, 2)
  ) %>%
  ungroup()

两种方法都能得到想要的结果,不过如果你的数据量很大,data.table的处理速度会更有优势哦。

内容的提问来源于stack exchange,提问作者Nahuel Patiño

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:22:17