r - R:沿列的条件累积总和/翻转
问题描述
我有一个数据集,我试图探索将变量限制在给定值并将超出部分滚动到后续间隔的影响。从概念上讲,我可以看到一些方法来做到这一点cumsum()
或类似的,但很难看到如何以合乎逻辑的方式实现它。
输入数据不是很大(10,000 行,而不是 100,000 行);所以效率并不重要。
表示输入数据:
间隔开始 | 千瓦时 |
---|---|
2021-01-01 19:00 | 12.2 |
2021-01-01 19:30 | 14.7 |
2021-01-01 20:00 | 20.2 |
2021-01-01 20:30 | 30.7 |
2021-01-01 21:00 | 36.3 |
2021-01-01 21:30 | 36.7 |
2021-01-01 22:00 | 30.1 |
2021-01-01 22:30 | 26.3 |
2021-01-01 23:00 | 18.1 |
2021-01-01 23:30 | 15.8 |
2021-01-02 00:00 | 11.4 |
2021-01-02 00:30 | 10.2 |
2021-01-02 01:00 | 11.9 |
2021-01-02 01:30 | 12.3 |
2021-01-02 02:00 | 9.1 |
2021-01-02 02:30 | 8.6 |
2021-01-02 03:00 | 8.3 |
2021-01-02 03:30 | 10.1 |
而我想要做的是将 kWh 列中的值限制为最大 20.0;如果该值超过了我想将多余的部分滚动到下一个间隔,然后是下一个,依此类推,直到所有能量都被考虑在内(所以在足够宽的间隔内的总和总是相同的),但峰值永远不会超过极限。
期望的输出:
间隔开始 | 千瓦时 | limit_kWh |
---|---|---|
2021-01-01 19:00 | 12.2 | 12.2 |
2021-01-01 19:30 | 14.7 | 14.7 |
2021-01-01 20:00 | 20.2 | 20.0 |
2021-01-01 20:30 | 30.7 | 20.0 |
2021-01-01 21:00 | 36.3 | 20.0 |
2021-01-01 21:30 | 36.7 | 20.0 |
2021-01-01 22:00 | 30.1 | 20.0 |
2021-01-01 22:30 | 26.3 | 20.0 |
2021-01-02 23:00 | 18.1 | 20.0 |
2021-01-02 23:30 | 15.8 | 20.0 |
2021-01-02 00:00 | 11.4 | 20.0 |
2021-01-02 00:30 | 10.2 | 20.0 |
2021-01-02 01:00 | 11.9 | 20.0 |
2021-01-02 01:30 | 12.3 | 20.0 |
2021-01-02 02:00 | 9.1 | 20.0 |
2021-01-02 02:30 | 8.6 | 17.7 |
2021-01-02 03:00 | 8.3 | 8.3 |
2021-01-02 03:30 | 10.1 | 10.1 |
因此,在此期间,能量总量在一段时间内是相同的,但峰值能量永远不会超过指定的限制。
任何帮助将不胜感激!
解决方案
这只是一个基本循环,可以满足您的需求。它不是特别有效,但我想不出使用矢量化使其更快的好方法。
overflow <- 0
for (i in 1:nrow(d)) {
if (d$kWh[i] + overflow > 20) {
d$limit_kWh[i] <- 20
overflow <- d$kWh[i] + overflow - 20
}
else {
d$limit_kWh[i] <- d$kWh[i] + overflow
overflow <- 0
}
}
基本上,超过 20 的数量(如果有)存储在overflow
变量中,该变量在每个条目处更新。
实际上,这是一种速度大约快 2 倍的方法,它更多地依赖于矢量化。它涉及创建一个overflow
向量,其中包含上一个日期的溢出量。
overflow <- numeric(nrow(d))
for (i in 2:nrow(d)) {
overflow[i] <- max(d$kWh[i-1] + overflow[i-1] - 20, 0)
}
d$limit_kWh <- pmin(d$kWh + overflow, 20)
推荐阅读
- javascript - 我找不到 404 api
- powershell - 在 Powershell 中制作动态菜单
- javascript - 为什么在 Vue.js 中使用 `var` 关键字?
- ios - 无法更改条带付款方式的来源和电子邮件
- android-intent - 通过 ADB 发送意向以使用字符串附加功能启动活动
- mysql - 控制台生成的Rails 4 SQL与操作执行的不同
- reactjs - React Js - 结合 Redux 和 Services 层
- perl - perl的双重版本
- java - 如何对二维数组进行 DFS 以记录从最左列到最右列的路径?
- java - 使用抽象表模型向 JTable 添加列