Mimi c инкрементный расчет из Excel в R - PullRequest
4 голосов
/ 09 июля 2020

Я пытаюсь выполнить mimi c процесс, который в настоящее время выполняется вручную в Excel с использованием R, чтобы упростить процесс, поэтому его не нужно выполнять вручную. Вот пример некоторых образцов данных, с которыми я работаю (имейте в виду, что это фрагмент гораздо большего набора данных).

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)

Я пытаюсь выполнить следующие манипуляции (pseduo- code):

qty_available = previous(qty_available) + supply_qty - forecast - demand_q 

Я могу проигнорировать первое наблюдение, потому что оно не имеет отношения к моей задаче.

Таким образом, во втором наблюдении у нас будет 13,500 + 1000 - 400 - 800, дающее нам 13,300. Третьим наблюдением будет 13,300 + 0 - 3000 - 6000, дающее нам 4300.

Если бы мне пришлось открыть этот набор данных в Excel (прочитать его в CSV), процесс прост. Я бы использовал эту формулу в ячейке A3 = A2+B3-C3-D3. Затем просто перетащите его вниз по оставшейся части столбца.

Как бы я мог использовать c это в R?

Я попытался сделать это с помощью следующей команды

df<- mutate(df, qty_available = lag(qty_available) + supply_qty - forecast - demand_q)

Эта команда не работает, так как она использует исходное значение 8500, а не вновь рассчитанное 13,300 в доступном запаздывающем количестве, и я изо всех сил пытаюсь найти другой способ сделать это. Приветствуются любые предложения!

Желаемый результат выглядит следующим образом:

qty_available<- c(13500, 13300, 4300)

desired_output<- data.frame(qty_available, supply_qty, forecast, demand_q)

Ответы [ 2 ]

5 голосов
/ 09 июля 2020

Здесь ..1 - это предыдущее значение в «накоплении», а ..3 - следующее значение второго аргумента. Начальное значение для ..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

Другой вариант (дает тот же результат)

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

И еще один без accumulate

df %>% 
  mutate(newcol =  qty_available[1] + 
                    cumsum(replace(supply_qty - forecast - demand_q, 1, 0)))
2 голосов
/ 09 июля 2020

Я думаю об использовании простого for-l oop:

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

qty_available_new <- df1$qty_available[1]

for (i in 2:nrow(df1)) {
  qty_available_new[i] <- qty_available_new[i-1] + 
                                df1$supply_qty[i] - df1$forecast[i] - df1$demand_q[i]
}

df1$qty_available <- qty_available_new

df1
#>   qty_available supply_qty forecast demand_q
#> 1         13500          0     1200      100
#> 2         13300       1000      400      800
#> 3          4300          0     3000     6000

Это не так сложно, как другой ответ, но я хотел показать, что циклы все еще будут полезны в R, даже несмотря на то, что существует миф о том, что мы должны избегать письменных петель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...