r - 从不同列中的先前行计算列值
问题描述
我正在尝试根据存储在前一行中但来自不同列的值来更新给定列的值。
我可以使用适用于小型数据集的 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]
我将不胜感激任何反馈
非常感谢
解决方案
在这种特殊情况下,您可以使用:
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
推荐阅读
- javascript - 如何使用 AJAX 管理 DataTables 中的子行
- flutter - 为什么使flutter_map居中不起作用?
- python - 获取 HTML 表格行数据到 Flask 函数
- reactjs - React Native to firestore:Firestore(8.2.1):连接WebChannel传输错误
- deep-learning - 在尝试训练 SeGAN 模型时尝试调用本地“回调”(零值)错误
- java - Maven 全新安装仅适用于特定项目的 sudo
- segmentation-fault - HAProxy ERR_EMPTY_RESPONSE
- hazelcast - 配置全局序列化程序后,添加 mancenter 集群配置失败
- c++ - MISRA C++ 2008 规则 5-2-3 咨询:不应在多态类型上执行从基类到派生类的强制转换
- arrays - 动态创建主机文件