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

基于多条件的R data.table增量成本计算需求

解决data.table新增incr_cost列的问题

我先默认你的需求是:对于每一行,incr_cost等于当前行的cost减去同一Sim分组中,active=1且j值小于当前行j的最近(最大j)那一行的cost;如果不存在这样的行(比如当前是分组内第一个active=1的行,或者当前行active=0),则incr_cost设为NA。要是我的假设不符合你的实际需求,补充更明确的条件后我再调整代码~

实现代码

library(data.table)

# 你的原始数据
dt <- data.table(Sim = c(1, 1, 1, 1, 2, 2, 2, 2), 
                 j = c(1, 2, 3, 4, 1, 2, 3, 4), 
                 active = c(1, 1, 0, 1, 1, 0, 0, 1), 
                 cost = c(100, 125, 200, 250, 100, 50, 125, 200))

# 新增incr_cost列
dt[, incr_cost := {
  # 提取当前分组内所有active=1的行的成本
  active_costs <- cost[active == 1]
  # 计算active行之间的成本差:第一个active行设为NA,后续行是当前成本减前一个active行的成本
  cost_diffs <- c(NA_real_, diff(active_costs))
  # 构建结果向量:active=0的行填NA,active=1的行对应计算好的差值
  result <- rep(NA_real_, .N)
  result[active == 1] <- cost_diffs
  result
}, by = Sim]

运行结果

执行后你的dt会变成这样:

Sim j active cost incr_cost
1:   1 1      1  100        NA
2:   1 2      1  125        25
3:   1 3      0  200        NA
4:   1 4      1  250       125
5:   2 1      1  100        NA
6:   2 2      0   50        NA
7:   2 3      0  125        NA
8:   2 4      1  200       100

调整说明

如果你希望分组内第一个active=1的行的incr_cost为0(即减去自身成本),只需要把cost_diffs的定义改成:

cost_diffs <- c(0, diff(active_costs))

内容的提问来源于stack exchange,提问作者Alton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:35:37