

У меня есть фрейм данных о заказах, который я пытаюсь уменьшить запасы по дням.Я начал писать цикл, чтобы уменьшить запасы для каждого типа груза.Для каждого дня заказов есть 6 последующих дней, которые должны покинуть заказы с этого дня (это находится в столбце увольнения).То, что я пытаюсь сделать, это написать цикл, начинающийся с unit_to_ship против ship_capacity (пример - 11/20 имеет 132393 новых юнитов в день, но вместимость корабля 130000).Отпуск 1-5 будет работать, но только около 10 КБ из 13 КБ в 6-й день отгрузки будут отправлены.Хотите написать цикл, который уменьшает инвентарь в каждом order_dt после того, как будет обработан выходной день.Хотелось бы, чтобы выходные данные выглядели как «тестовый» фрейм данных, но также со столбцом unit_remaining (пример: ~ 3k, которые не отправляются).
вот мой код:
order_dt <- c("43424", "43425", "43426", "43427", "43428", "43429", "43430",
"43431", "43432", "43433", "43434", "43435", "43436", "43437",
"43438", "43439", "43440", "43441")
new_units_proj <- c(132993, 408989, 584165, 710695, 654237, 353607,
469608, 433387, 93930, 143648, 167652, 164357,
162038, 151675, 180338, 186996, 172749, 150275)
ship_capacity <- c(130000, 160000, 300000, 340000, 375000, 375000, 375000,
375000, 375000, 375000, 375000, 375000, 375000, 325000,
160000, 170000, 168000, 173000)
inputs <- cbind(order_dt, new_units_proj, ship_capacity)
inputs <- data.table(inputs)
inputs <- inputs %>%
.[,
`:=` (order_dt = as.numeric(order_dt),
new_units_proj = as.numeric(new_units_proj),
ship_capacity = as.numeric(ship_capacity))] %>%
.[, order_dt := as.Date(inputs$order_dt, origin = '1899-12-30')]
leave_day <- data.frame(leave_day = 1:6,
pct_out = c(.15, .33, .16, .11, .15, .1))
leave_day <- data.table(leave_day)
cross.join <- function(a, b) {
idx <- expand.grid(seq(length=nrow(a)), seq(length=nrow(b)))
cbind(a[idx[,1],], b[idx[,2],])
}
orders <- cross.join(inputs, leave_day)
orders <- orders %>% arrange(order_dt)
orders <- orders %>%
mutate(units_to_ship = round(pct_out * new_units_proj))
test <- orders %>%
filter(order_dt == as.Date('2018-11-20')) %>%
mutate(remaining_capacity = NA, new_capacity = NA) %>%
select(order_dt, new_units_proj, leave_day, pct_out, units_to_ship,
ship_capacity, remaining_capacity, new_capacity) %>%
mutate(remaining_capacity = ship_capacity - units_to_ship) %>%
mutate(new_capacity = lag(remaining_capacity, n = 1) - units_to_ship)
test <- orders %>%
filter(order_dt == as.Date('2018-11-20'))
for(i in 1:nrow(test)){
test$new_cap <- test$ship_capacity - test$units_to_ship
}
#suppressWarnings(
for (i in 1:nrow(test)){
test$remaining_capacity = test$ship_capacity - test$units_to_ship
if(i == nrow(test)){
test$ship_capacity[i] <- test$remaining_capacity[i]
} else
test$ship_capacity[i + 1] <- test$remaining_capacity[i]
if(test$units_to_ship <= test$ship_capacity){
test$shipped_actual <- test$units_to_ship
} else
test$leftover_units <- test$units_to_ship - test$remaining_capacity
}
#)