基于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
相关产品推荐
相关产品推荐

