我想计算等待或排队的物品数量。让我们说,我有固定容量102件/小时和不同的来料9小时。
作为数据表:
dt<-data.table(hour = c(1,2,3,4,5,6,7,8,9),
incoming = c(78,102,115,117,105,99,91,80,71),
capacity = rep(102,9))
我想计算每个时期的排队项目。 在1和2容量就足够了,队列是0。 3个,13个项目排队 在4个,15 + 13个积压的项目排队。 6,共有31个积压项目,扣除了3个项目,其中28个排队。
我尝试了几个选项,但无法弄清楚如何计算。
结果应该是:
答案 0 :(得分:1)
R中的显式循环不会让你走得太远,我没有看到这样的矢量化解决方案,但使用Rcpp
解决这个问题很简单:
library(Rcpp)
cppFunction("NumericVector queue(NumericVector x) {
NumericVector res(x.size());
res[0] = std::max<double>(0, x[0]);
for (int i = 1, size = x.size(); i < size; ++i) {
res[i] = std::max<double>(0, res[i-1] + x[i]);
}
return res;
}")
dt[, queued := queue(incoming - capacity)][]
# hour incoming capacity queued
#1: 1 78 102 0
#2: 2 102 102 0
#3: 3 115 102 13
#4: 4 117 102 28
#5: 5 105 102 31
#6: 6 99 102 28
#7: 7 91 102 17
#8: 8 80 102 0
#9: 9 71 102 0
答案 1 :(得分:0)
另一种选择:
require(data.table)
dt<-data.table(hour = c(1,2,3,4,5,6,7,8,9),
incoming = c(78,102,115,117,105,99,91,80,71),
capacity = rep(102,9))
dt$incoming_capactity<- dt$incoming-dt$capacity
dt$carriedover<- 0
dt$carriedover[1]<- max(0,dt$incoming_capactity[1]) #added
for( i in 2:length(dt$carriedover)) {
dt$carriedover[i]<- max(0,dt$incoming_capactity[i] + dt$carriedover[i-1])
}
dt
答案 2 :(得分:0)
我创建了一个单独的函数来获取像@ sebastian-c那样的排队号码,但是使用@ R.S。的逻辑。喜欢这个
get_queue <- function(x){
n <- length(x)
y <- c(max(0, x[[1]]), rep(0, n - 1))
for(i in 2:n){
y[i] <- max(0, y[i - 1] + x[i])
}
y
}
然后
dt[,incoming_capacity := incoming - capacity]
dt[,queued := get_queue(incoming_capacity)]