从 R 中的 excel 模拟增量计算

tfr*_*950 4 excel r data-manipulation dataframe

我正在尝试模拟当前使用 R 在 Excel 中手动完成的过程,以帮助简化该过程,因此不需要手动完成。这是我正在使用的一些示例数据的示例(请记住,这是一组更大的数据的片段)。

qty_available<- c(13500, 8500, 4600)
supply_qty<- c(0, 1000, 0)
forecast<- c(1200, 400, 3000)
demand_q<- c( 100, 800, 6000)

df<- data.frame(qty_available, supply_qty, forecast, demand_q)
Run Code Online (Sandbox Code Playgroud)

我正在尝试进行以下操作(伪代码):

qty_available = previous(qty_available) + supply_qty - forecast - demand_q 
Run Code Online (Sandbox Code Playgroud)

我可以忽略第一个观察结果,因为它与我的任务上下文无关。

所以在第二个观察中,我们会给13,500 + 1000 - 400 - 800我们13,300. 第三个观察结果将是13,300 + 0 - 3000 - 6000给予我们4300

如果我要在 Excel 中打开此数据集(以 CSV 格式读取),则过程很简单。我会在 cell 中使用这个公式A3 = A2+B3-C3-D3。然后只需将其向下拖动到列的其余部分即可。

我将如何在 R 中模仿这一点?

我已尝试使用以下命令执行此操作

df<- mutate(df, qty_available = lag(qty_available) + supply_qty - forecast - demand_q)
Run Code Online (Sandbox Code Playgroud)

此命令不起作用,因为它使用原始 8500 而不是新计算的可用滞后数量中的 13,300,我正在努力找出另一种方法来做到这一点。任何建议将不胜感激!

所需的输出如下:

qty_available<- c(13500, 13300, 4300)

desired_output<- data.frame(qty_available, supply_qty, forecast, demand_q)
Run Code Online (Sandbox Code Playgroud)

Ice*_*can 5

..1是“累积”..3中的前一个值,是第二个参数的下一个值。for 的初始值..1是第一个参数的第一个元素。

library(tidyverse) # or dplyr and purrr

df %>% 
  mutate(newcol = accumulate2(qty_available, 
                              tail(supply_qty - forecast - demand_q, -1), 
                              ~ ..1 + ..3))
         

#   qty_available supply_qty forecast demand_q newcol
# 1         13500          0     1200      100  13500
# 2          8500       1000      400      800  13300
# 3          4600          0     3000     6000   4300
Run Code Online (Sandbox Code Playgroud)

另一种选择(给出相同的输出)

df %>% 
  mutate(newcol = accumulate(tail(supply_qty - forecast - demand_q, -1), `+`, 
                             .init = qty_available[1]))
Run Code Online (Sandbox Code Playgroud)

而另一个没有任何 accumulate

df %>% 
  mutate(newcol =  qty_available[1] + 
                    cumsum(replace(supply_qty - forecast - demand_q, 1, 0)))
Run Code Online (Sandbox Code Playgroud)