gpt4 book ai didi

r - r data.table 计算的多个条件

转载 作者:行者123 更新时间:2023-12-04 14:54:23 25 4
gpt4 key购买 nike

我有一个如下所示的 data.table:

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

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”,它从不同行的成本中减去每行 i 的成本,我将其称为第 k 行,其中第 k 行满足以下条件:
  • sim_k = sim_i
  • active_k = 1
  • j_k < j_i
  • 第 k 行包含满足上述 3 个条件的所有行中最大的 j

  • 对于 j=1 的行,incr_cost 可以是 NA。

    在我的示例中,解决方案如下所示:
       Sim j active cost incr_cost
    1: 1 1 1 100 NA
    2: 1 2 1 125 25
    3: 1 3 0 200 75
    4: 1 4 1 250 125
    5: 2 1 1 100 NA
    6: 2 2 0 50 -50
    7: 2 3 0 125 25
    8: 2 4 1 200 100

    看起来这类似于 shift 的应用程序,除了不是按原样在 data.table 上“移位”,我想在 row-reduced data.table 上移位,其中不满足我的条件的行被过滤掉。我很难理解如何识别最大 j 值小于当前行(并满足其他两个条件)的行。

    除了在选择行 k 时不考虑行是否处于事件状态之外,以下工作正常:
    dt[, incr_cost := cost - shift(cost, fill=NA), by=Sim]

    我正在使用 r data.table,但也欢迎使用非 data.table 解决方案。谢谢!

    最佳答案

    您可以使用滚动连接:

    dt[, v := 
    cost - .SD[.(active = 1, Sim = Sim, j = j - 1), on=.(active, Sim, j), roll=TRUE, x.cost]]

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

    这将查找元组 .(active = 1, Sim = Sim, j = j - 1)当没有找到完全匹配时,“滚动”到最后 j适合的值(如果有)。

    这个怎么运作

    jx[i, j] , .SD只是表本身的简写,即“数据子集”。

    j加盟 x[i, on=, roll=, j] ...
  • 前缀 x.*指的是 x 的列(这里, .SD );和类似
  • i.*将是 i 列的前缀(这里是元组)。

  • (OP 使用 j 作为名称可能会使这变得困惑。我的意思是 jDT[i, j, ...] 中的参数。)

    关于r - r data.table 计算的多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49951646/

    25 4 0