r - 考虑 R 中的输入和输出计算存储值
问题描述
我解释说,我在执行储层平衡过程时遇到了困难。
我想考虑输入和输出(消耗)计算月底存储的值。
前任:
在开始时(一月初),水库是空的,所以有一个 X 值的输入和一个 Y 值的输出。剩下的将是存储的价值。所以在二月份有一个新的输入(X 可能与一月份的 X 不同)并且出口保持不变。存储值现在将是 2 月输入 + 1 月存储值 - 输出。以此类推,直到十二月。
附带条件是,如果结果为负,则将考虑 0,如果大于 16000,则将考虑 16000
我的数据是:
月 | 输入 | 出口 |
---|---|---|
一月 | 4700 | 2250 |
fev | 6990 | 2250 |
马尔 | 8900 | 2250 |
abr | 9000 | 2250 |
可能 | 5250 | 2250 |
君 | 2790 | 2250 |
七月 | 1770 | 2250 |
前 | 492 | 2250 |
放 | 89 | 2250 |
出去 | 572 | 2250 |
十一月 | 830 | 2250 |
德兹 | 744 | 2250 |
预期结果:
月 | 输入 | 出口 | 已存储 |
---|---|---|---|
一月 | 4700 | 2250 | 2516 |
fev | 6990 | 2250 | 7256 |
马尔 | 8900 | 2250 | 13980 |
abr | 9000 | 2250 | 16000 |
可能 | 5250 | 2250 | 16000 |
君 | 2790 | 2250 | 15688 |
七月 | 1770 | 2250 | 14677 |
前 | 492 | 2250 | 12772 |
放 | 89 | 2250 | 10584 |
出去 | 572 | 2250 | 8735 |
十一月 | 830 | 2250 | 7066 |
德兹 | 744 | 2250 | 5915 |
我设法在excel中做到了,但我需要自动化一些事情,这就是我使用R的原因
解决方案
使用 tidyverse 选项purrr::accumulate
可能如下所示。
library(dplyr)
library(purrr)
bound_sum <- function(x, y) {
if (x+y > 16000)
16000
else if (x+y < 0)
0
else
x+y
}
df %>%
mutate(diff = case_when(row_number() == 1 & input-exit < 0 ~ 0,
row_number() == 1 & input-exit > 16000 ~ 16000,
T ~ input-exit),
stored = accumulate(diff, bound_sum)) %>%
select(-diff)
# # A tibble: 12 x 4
# month input exit stored
# <chr> <dbl> <dbl> <dbl>
# 1 jan 4700 2250 2450
# 2 fev 6990 2250 7190
# 3 mar 8900 2250 13840
# 4 abr 9000 2250 16000
# 5 may 5250 2250 16000
# 6 jun 2790 2250 16000
# 7 jul 1770 2250 15520
# 8 ago 492 2250 13762
# 9 set 89 2250 11601
# 10 out 572 2250 9923
# 11 nov 830 2250 8503
# 12 dez 744 2250 6997
数据
df <- structure(list(month = c("jan", "fev", "mar", "abr", "may", "jun",
"jul", "ago", "set", "out", "nov", "dez"), input = c(4700, 6990,
8900, 9000, 5250, 2790, 1770, 492, 89, 572, 830, 744), exit = c(2250,
2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250
)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", "data.frame"
))
推荐阅读
- ruby - Watir:如何设置`chrome://settings/content/pdfDocuments`
- python - 如何将此字典的元素放入行中
- linux - 无法以普通用户身份运行 docker
- r - 如何同时过滤多个条件?
- react-native - 在 React Native 中在图像上绘制点并在不同的屏幕尺寸上渲染
- javascript - MSAL.JS 的异步/等待/承诺问题
- r - 错误:`mutate()` 输入`coding` 有问题。x 没有适用于“字符”类对象的“选择”方法
- web - 在 Hugo 主题上创建嵌套菜单?
- python - 如何在面板数据上使用 LSTM?
- remote-desktop - 无法连接到远程桌面或远程管理员