首页 > 解决方案 > 从不同列中的先前行计算列值

问题描述

我正在尝试根据存储在前一行中但来自不同列的值来更新给定列的值。

我可以使用适用于小型数据集的 for 循环来做到这一点,但是在处理大型 DT(比如超过 1MM 行)时,这个过程当然需要很长时间。下面是一个小例子:

library(data.table)

DT <- data.table(Year = 2019:2038, Area = 500, Cos = c(0,0,0,150,0,0,
  0,0,350,0,0,0,0,0,0,0,120,200,80,100), Rep = c(0,0,0,0,150,0,0,0,0,
  350,0,0,0,0,0,0,0,0,0,0), Calc = c(500,500,500,500,500,500,500,500,
  500,500,500,500,500,500,500,500,500,380,180,100))

基本上,我想复制计算如下的列“Calc”:

1) 如果行 == 1

Calc[1] == Area[1]

2) 对于行 > 1

Calc[i] == Rep[i] + Calc[i-1] - Cos[i-1]

我将不胜感激任何反馈

非常感谢

标签: rdata.table

解决方案


在这种特殊情况下,您可以使用:

DT[, newCalc := Calc[1L] + cumsum(Rep - shift(Cos, fill=0L))]

输出:

    Year Area Cos Rep Calc    d newCalc
 1: 2019  500   0   0  500    0     500
 2: 2020  500   0   0  500    0     500
 3: 2021  500   0   0  500    0     500
 4: 2022  500 150   0  500    0     500
 5: 2023  500   0 150  500    0     500
 6: 2024  500   0   0  500    0     500
 7: 2025  500   0   0  500    0     500
 8: 2026  500   0   0  500    0     500
 9: 2027  500 350   0  500    0     500
10: 2028  500   0 350  500    0     500
11: 2029  500   0   0  500    0     500
12: 2030  500   0   0  500    0     500
13: 2031  500   0   0  500    0     500
14: 2032  500   0   0  500    0     500
15: 2033  500   0   0  500    0     500
16: 2034  500   0   0  500    0     500
17: 2035  500 120   0  500    0     500
18: 2036  500 200   0  380 -120     380
19: 2037  500  80   0  180 -200     180
20: 2038  500 100   0  100  -80     100

推荐阅读