首先是样本数据
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
答案 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