Я хочу смоделировать процесс выделения ресурсов, где на каждом шаге:
- Предопределенное количество ресурсов вычитается из общего запаса ресурсов ("available.resources")
- Предопределенное количество ресурса должно быть добавлено к запасу каждой единицы (последний
столбец)
- Если добавлено количество, должна быть реализована единица Этап / Уровень (Уровень + 1)
Процесс должен проходить по идентификатору 1 - 5 и повторяться до тех пор, пока каждое подразделение не перейдет на уровень / уровень 5 или глобальный запас ресурсов не будет исчерпан.
Я предоставляю прокомментированный, воспроизводимый скрипт ниже:
# 1) Initialization
available.resources <- 35 # resource stock
# 2) Data input
dataframe <- as.data.frame(cbind(c(1:5), 1,2,3,4,5, 0,0))
colnames(dataframe) <- c("ID", "Stage1", "Stage2", "Stage3", "Stage4", "Stage5", "Stage", "Resource")
# 3) Function "staging" for filling up units along IDs, then along stages
staging <- function(selected) { # Selected row in a dataframe
if (available.cap < 0) {break} # End if no more resources to allocate
if (selected[8] == 5) {next} # Jump to next row if unit has reached final Stage 5
# Check stage, add resource into stock and subtract from global resource stock
if (selected[8] == 4) {
selected[9] <- selected[9] + selected[6]
available.cap <- available.cap - selected[6]}
if (selected[8] == 3) {
selected[9] <- selected[9] + selected[5]
available.cap <- available.cap - selected[5]}
if (selected[8] == 2) {
selected[1,9] <- selected[9] + selected[4]
available.cap <- available.cap - selected[4]}
if (selected[8] == 1) {
selected[9] <- selected[9] + selected[3]
available.cap <- available.cap - selected[3]}
if (selected[8] == 0) {
selected[9] <- selected[2]
available.cap <- available.cap - selected[2]}
# Add "1" to Stage after each process; build result dataframe
selected[8] <- selected[8] + 1;
dataframe <- rbind(dataframe,selected)
}
# 4) Execution
dataframe2 <- apply(dataframe, 1, staging) # Apply function over all rows of dataframe
Ожидаемый результат будет:
ID Stage1 Stage2 Stage3 Stage4 Stage5
1 1 2 3 4 5
2 1 2 3 4 5
3 1 2 3 4 5
4 1 2 3 4 5
5 1 2 3 4 5
Actual.Stage Resource.Stock
4 10
4 10
3 6
3 6
3 6
К сожалению, функция возвращает только список из нескольких матриц, где только к одному элементу (последний блок "ID5") добавлена 1 единица) ..