Добавление и вычитание значений из столбцов в фрейме данных

У меня фрейм данных, как показано ниже:

+-----+---------+-----+-----+-----------------+----------+----------+------------+
| ID  | CURRENT | JAN | FEB | CURRENT_IN_2018 | JAN_2018 | FEB_2018 | UNITS_SWAP |
+-----+---------+-----+-----+-----------------+----------+----------+------------+
| 123 |       2 |   3 |   4 |               5 |        6 |        7 |         12 |
| 456 |       1 |   5 |   0 |               4 |        8 |        6 |          6 |
+-----+---------+-----+-----+-----------------+----------+----------+------------+

Я пытаюсь вычесть число в UNITS_SWAP из CURRENT_IN_2018, JAN_2018 и FEB_2018 последовательно, пока число в UNITS_SWAP не достигнет нуля. Также при этом добавьте количество вычтенных UNITS_SWAP из каждой строки в соответствующие соответствующие строки, например, если 5 единиц вычтено из current_in_2018, затем добавьте 5 единиц в ТЕКУЩЕМ, так далее и так далее для ЯНВАРЯ и ФЕВРАЛЯ, чтобы конечный результат как под:

+-----+---------+-----+-----+-----------------+----------+----------+------------+
| ID  | CURRENT | JAN | FEB | CURRENT_IN_2018 | JAN_2018 | FEB_2018 | UNITS_SWAP |
+-----+---------+-----+-----+-----------------+----------+----------+------------+
| 123 |       7 |   9 |   5 |               0 |        0 |        6 |          0 |
| 456 |       5 |   7 |   0 |               0 |        6 |        6 |          0 |
+-----+---------+-----+-----+-----------------+----------+----------+------------+

Скрипт для загрузки данных:

DF <- data.frame(ID = c(123,456), 
                  CURRENT = c(2,1), 
                  JAN = c(3,5),
                  FEB=c(4,0),                  
                  CURRENT_2018 = c(5,4), 
                  JAN_2018 = c(6,8),
                  FEB_2018=c(7,6),
                  UNITS_SWAP =c(12,6))

person user11845701    schedule 15.12.2019    source источник


Ответы (1)


Вы можете сделать это, но обратите внимание, что это перезапишет ваш исходный DF:

cols <- c('CURRENT', 'JAN', 'FEB')
for (i in 1:NROW(DF)) {
  while (DF[i, 'UNITS_SWAP'] > 0) {
    for (col in cols) {
      excess <- min(DF[i,'UNITS_SWAP'], DF[i, paste0(col, '_2018')])
      DF[i, col] <- DF[i, col] + excess
      DF[i, paste0(col, '_2018')] <- DF[i, paste0(col, '_2018')] - excess
      DF[i, 'UNITS_SWAP'] <- DF[i, 'UNITS_SWAP'] - excess
    }
  }
}

Поскольку ваши столбцы имеют определенную структуру (column соответствие column_2018), нам просто нужно просмотреть их в указанном вами порядке и вставить _2018, чтобы получить соответствующий соответствующий столбец.

person user2474226    schedule 15.12.2019