R:计算需求和供应动态

时间:2018-02-12 17:10:34

标签: r

首先是样本数据

set.seed(123)
dat <- data.frame(day= 1:50 ,demand = sample(0:17, size = 50,replace = T),supply = sample(2:9, size = 50,replace = T))
reservoir <- 200

我有从第1天到第50天开始的需求和供应数据 和第四列是供需之间的差异

dat$balance <- dat$supply - dat$demand 

我想计算另一个名为net deficit的列。这是逻辑

如果某一天,需求&gt;供给,存在赤字。但是,这个 reservoir可以满足赤字,因此net deficit列将为零,

如果供应&gt;需求,供应过剩要么被添加到水库(仅当水库<200)。如果水库满负荷(200),多余的供应被丢弃

如果需求&gt;供应和储备为零,然后net deficit列获得需求和供应之间的差异

例如,从第1天开始,有一个赤字(balance)为3.这个赤字由水库满足(使其为197),net deficit为零,

第2天:赤字为-9,从水库借来(使其为188),net defict将再次为零。

第3天,有超过1用于填充水库(因为水库<100)net deficit得到0值,储水量变为(189)

第4天:水库的平衡存在赤字13。水库进一步减少到176

我希望这很清楚。

如果在某个时间点,水库变为0,则赤字无法得到补偿 因此net deficit获取dat$balance

的值

1 个答案:

答案 0 :(得分:0)

解决方案基本上是使用for循环来构建基于每天余额的reservoir向量。提供的样本实际上并没有设法在50天内清空水库,所以我把它做得更长(但这意味着数字与50天的例子不同)。然后,您可以简单地将向量作为列绑定到数据,并将net_deficit列设置为零,而reservoir为正。

library(tidyverse)
set.seed(123)
dat <- tibble(
  day = 1:100,
  demand = sample(0:17, size = 100,replace = T),
  supply = sample(2:9, size = 100,replace = T)
  )

balance <- dat$supply - dat$demand
reservoir <-  rep(200, nrow(dat))
reservoir[1] <- reservoir[1] + balance[1]
for (day in 2:nrow(dat)){
  reservoir[day] <- reservoir[day - 1] + balance[day]
}

out <- dat %>%
  bind_cols(balance =  balance, reservoir = reservoir) %>%
  mutate(net_deficit = ifelse(reservoir >= 0, 0, reservoir))
out[61:70, ]
# A tibble: 10 x 6
     day demand supply balance reservoir net_deficit
   <int>  <int>  <int>   <int>     <dbl>       <dbl>
 1    61     11      6     - 5      3.00        0   
 2    62      1      4       3      6.00        0   
 3    63      6      7       1      7.00        0   
 4    64      4      4       0      7.00        0   
 5    65     14      4     -10    - 3.00      - 3.00
 6    66      8      6     - 2    - 5.00      - 5.00
 7    67     14      7     - 7    -12.0       -12.0 
 8    68     14      3     -11    -23.0       -23.0 
 9    69     14      5     - 9    -32.0       -32.0 
10    70      7      4     - 3    -35.0       -35.0