#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