Вычисление нового накопительного столбца во фрейме данных на основе существующих столбцов

#r #tidyverse

#r #tidyverse

Вопрос:

У меня есть набор данных, который я хочу использовать для оценки своего прогноза. Набор данных выглядит следующим образом:

 tibble(article=rep(21,5), estimated_sales=rep(50, 5), week=c(38,39,40,41,42), stock=c(500, 400, 375, 400, 350), purchase=c(0,0,0,50,0))

# A tibble: 5 x 5
  article estimated_sales  week stock purchase
    <dbl>           <dbl> <dbl> <dbl>    <dbl>
1      21              50    38   500        0
2      21              50    39   400        0
3      21              50    40   375        0
4      21              50    41   400       50
5      21              50    42   350        0
  

Наконец, я хотел бы иметь набор данных с новой переменной real_sales , рассчитанной следующим образом (например, для недели 40):
375 (запас на 40-ю неделю) — 400 (запас на 41-ю неделю) 50 (покупка на 41-й неделе) = 25, что затем является наблюдением для real_sales переменной за 40-ю неделю.

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

 # A tibble: 5 x 6
  Article estimated_sales  week stock purchase rea_sales
    <dbl>           <dbl> <dbl> <dbl>    <dbl>     <dbl>
1      21              50    38   500        0       100
2      21              50    39   400        0        25
3      21              50    40   375        0        25
4      21              50    41   400       50       100
5      21              50    42   300        0        NA
  

Комментарии:

1. Последнее значение stock равно 350 на вашем входе, тогда как 300 в вашем ожидаемом выходе.

Ответ №1:

Вы можете добиться этого с помощью lead :

 library(dplyr)
df %>% mutate(real_sales = stock - lead(stock)   lead(purchase))

#  article estimated_sales  week stock purchase real_sales
#    <dbl>           <dbl> <dbl> <dbl>    <dbl>      <dbl>
#1      21              50    38   500        0        100
#2      21              50    39   400        0         25
#3      21              50    40   375        0         25
#4      21              50    41   400       50         50
#5      21              50    42   350        0         NA
  

и shift в data.table :

 library(data.table)
setDT(df)[, real_sales := stock - shift(stock, type = 'lead')   
                          shift(purchase, type = 'lead')]
  

Ответ №2:

Мы можем использовать base R для этого

 df$real_sales <- with(df, stock - c(stock[-1], NA)  
                  c(purchase[-1], NA))
df$real_sales
#[1] 100  25  25  50  NA