dplyr: подсчитать дни пополнения товара - PullRequest
0 голосов
/ 30 октября 2019

Я работаю над набором данных, в котором мне нужно рассчитать, сколько времени потребуется розничному магазину для пополнения некоторых товаров из-за нехватки, и вот краткий обзор набора данных в простейшей форме:

enter image description here

Date <- c("2019-1-1","2019-1-2","2019-1-3","2019-1-4","2019-1-5","2019-1-6","2019-1-7","2019-1-8")
Product <- rep("Product A",8)
Net_Available_Qty <- c(-2,-2,10,8,-5,-6,-7,0)
sample_df <- data.frame(Date,Product,Net_Available_Qty)

Когда значение Net_Available_Qty становится отрицательным, это означает, что существует дефицит. Когда он возвращается к 0 или положительному количеству, это означает, что запас был восстановлен. То, что мне нужно рассчитать, это дни между тем, когда мы впервые видим дефицит и когда он восстанавливается. В этом случае для 1-го дефицита потребовалось 2 дня для восстановления, а для второго - 3 дня.

Я являюсь пользователем Tidyverse, и решение для Tidyverse будет наиболеедобро пожаловать. Спасибо!

1 Ответ

1 голос
/ 30 октября 2019

Я надеюсь, что кто-то еще найдет более чистое решение. Но при этом получается diffDate, который присваивает разницу в дате с момента, когда отрицание становится положительным / нулевым.

sample_df %>%
  mutate(sign = ifelse(Net_Available_Qty > 0, "pos", ifelse(Net_Available_Qty < 0, "neg", "zero")),
         sign_lag = lag(sign, default = sign[1]),       # get previous value (exception in the first place)
         change = ifelse(sign != sign_lag, 1 , 0),      # check if there's a change
         sequence=sequence(rle(as.character(sign))$lengths)) %>%
  group_by(sequence) %>%
  mutate(diffDate = as.numeric(difftime(Date, lag(Date,1))),
         diffDate=ifelse(Net_Available_Qty <0, NA, ifelse((sign=='pos'| sign=='zero') & sequence==1, diffDate, NA))) %>% 
  ungroup() %>%
  select(Date, Product, Net_Available_Qty, diffDate)
...