首页 > 解决方案 > 考虑 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的原因

标签: rinputoutput

解决方案


使用 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"
))

推荐阅读