滚动队列大小

时间:2016-10-21 09:24:04

标签: r data.table

我想计算等待或排队的物品数量。让我们说,我有固定容量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个排队。

我尝试了几个选项,但无法弄清楚如何计算。

结果应该是:

enter image description here

3 个答案:

答案 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)]