r - 从数据框中的列中添加和减去值

标签 r aggregate plyr dplyr

我有一个数据框如下:

+-----+---------+-----+-----+-----------------+----------+----------+------------+
| 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 |
+-----+---------+-----+-----+-----------------+----------+----------+------------+

我在这里尝试做的是从 CURRENT_IN_2018JAN_2018FEB_2018 中减去 UNITS_SWAP 中的数字> 依次进行,直到 UNITS_SWAP 中的数字达到零。此外,在执行此操作时,将从每行减去的 UNITS_SWAP 数量添加到各自的匹配行,例如,如果从 current_in_2018 中扣除 5 个单位,则在 CURRENT 中添加 5 个单位,对于 JAN 依此类推和 FEB,最终结果如下:

+-----+---------+-----+-----+-----------------+----------+----------+------------+
| 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))

最佳答案

您可以这样做 - 但请注意,它会覆盖您的源 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
    }
  }
}

由于您的列具有明确的结构(columncolumn_2018 匹配),因此我们只需按照您指定的顺序遍历它们,然后粘贴 _2018 获取相关的匹配列。

关于r - 从数据框中的列中添加和减去值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59341702/

相关文章:

R data.table fwrite 到 fread 空间分隔符和空

mysql - 按月汇总金额列 - sql

sql - 我可以从 sql server 中的一个 sql 查询中获取 count() 和行吗?

r - 当行值匹配时,将数据框列中的值除以来自不同数据框的值

r - R 中的模型公式运算符创建什么数据结构?

r - 将连续的控制台输出合并到一个 block 中

r - 如何在R中使用cbind合并两个csv?

postgresql - 如何向 PostgreSQL 添加自定义聚合函数(例如 MAX/MIN)?

r - 在 R 中按组汇总数据帧的所有数字列

r - 让 Zelig 处理列表