【问题标题】:Calculate a column using self-referencing lagging formula in R使用 R 中的自引用滞后公式计算列
【发布时间】:2019-03-22 14:56:00
【问题描述】:

我正在尝试使用包括我计算的列在内的几列中的滞后行号来计算一列。实际上,我想要一个自引用的累积公式。

一个例子:

library(data.table)
library(lubridate)

dt <- data.table(date = today()+1:10, supply = c(1,1,2,3,1,0,1,2,1,3), demand = c(0,0,1,0,3,2,1,0,1,0), inventory = 0)
          date supply demand inventory
 1: 2018-10-18      1      0         0
 2: 2018-10-19      1      0         0
 3: 2018-10-20      2      1         0
 4: 2018-10-21      3      0         0
 5: 2018-10-22      1      3         0
 6: 2018-10-23      0      2         0
 7: 2018-10-24      1      1         0
 8: 2018-10-25      2      0         0
 9: 2018-10-26      1      1         0
10: 2018-10-27      3      0         0

我想要实现的是参考上期库存+供需的库存计算:

          date supply demand inventory
 1: 2018-10-18      1      0         0
 2: 2018-10-19      1      0         1
 3: 2018-10-20      2      1         2
 4: 2018-10-21      3      0         3
 5: 2018-10-22      1      3         6
 6: 2018-10-23      0      2         4
 7: 2018-10-24      1      1         2
 8: 2018-10-25      2      0         2
 9: 2018-10-26      1      1         4
10: 2018-10-27      3      0         4

但是,当我尝试时:

dt[,inventory := shift(inventory, fill = 0) + shift(supply, fill = 0) - shift(demand, fill = 0)]

我明白了:

          date supply demand inventory
 1: 2018-10-18      1      0         0
 2: 2018-10-19      1      0         1
 3: 2018-10-20      2      1         1
 4: 2018-10-21      3      0         1
 5: 2018-10-22      1      3         3
 6: 2018-10-23      0      2        -2
 7: 2018-10-24      1      1        -2
 8: 2018-10-25      2      0         0
 9: 2018-10-26      1      1         2
10: 2018-10-27      3      0         0

因为 shift 指的是以前存储的数字,而不是新计算的数字。

我可以使用循环来解决这个问题,但它并不适合我作为一个优雅的解决方案。有没有其他方法可以到达那里?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    好的,我想我找到了一种“作弊”的方法来绕过它:

    dt[,':=' (cum_supply = cumsum(supply), cum_demand = cumsum(demand))]
    dt[,inventory := dt[date==today()+1,inventory] + shift(cum_supply,fill = 0) - shift(cum_demand,fill = 0)]
    

    但是,如果有人可以提出更优雅的解决方案,我很乐意看到它!

    【讨论】:

    • 每一天只根据供求关系改变库存,所以不妨把这个差异当作一个变量,有dt[, v := shift(cumsum(supply-demand), fill=first(inventory))]?
    • 啊,太好了。我给出的示例是简化的(仅限 1 个产品),但我确信我可以使用您的解决方案来定制它,谢谢!
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多