Как использовать семейство «применить» для построения простой модели запаса ресурсов с этапами в кадре данных в R? - PullRequest
0 голосов
/ 29 августа 2018

Я хочу смоделировать процесс выделения ресурсов, где на каждом шаге:

  • Предопределенное количество ресурсов вычитается из общего запаса ресурсов ("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 единица) ..

...