首先是示例数据
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的列。下面是逻辑
如果对于给定的一天,需求>供应,则存在赤字。然而,这个赤字可以由reservoir来弥补,因此net deficit列将为零,
如果供应>需求,则将多余的供应添加到水库(仅当水库<200时).If水库已满负荷(200),则丢弃多余的供应
如果需求>供应和水库为零,则net deficit列将获取需求和供应之间的差值
例如,从第1天开始,赤字(balance)为3。此赤字由水库弥补(使其为197),并且net deficit为零。
第二天:赤字是-9,这是从储存库借来的(使其为188),net defict将再次为零。
第3天,有多余的1用于填充水库(由于水库< 100),net deficit的值为0,水库变为(189)
第四天:有13的赤字,这是由水库弥补。存储量进一步减少到176个
我希望这一点是清楚的。
如果在某个时间点,储层变为0,则无法补偿赤字,因此net deficit将获得dat$balance的值
发布于 2018-02-13 08:03:10
解决方案基本上是使用for循环根据每天的余额构建reservoir向量。所提供的样本实际上没有设法在50天内清空储水池,所以我将其延长了(但这意味着数字与50天的示例不同)。然后,您可以简单地将向量作为列绑定到数据,并在reservoir为正数时将net_deficit列设置为零。
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 https://stackoverflow.com/questions/48751875
复制相似问题