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

