r语言 - 如何矢量化后续行的比较



我正在尝试加快当前针对以下问题的实现速度:

period中订购的物品articleID到达是通过其leadtime决定的,该因时期而异。我想确定一篇文章被overtaken的次数,即在较晚的时期订购的物品比较早订购的物品到达。

我目前的实现(是的,两个丑陋的 for 循环(:

library(data.table)
lt <- CJ(articleID=c("A", "B", "C"), period=1:100)
lt$leadtime <- round(runif(length(lt$period))*100,0)
lt[, arrival:=period+leadtime]
setkey(lt,articleID,period)
overtakenSum <- 0
for (art in unique(lt$articleID)) {
    for (p in sort(unique(lt[art,period]))) {
        # find subsequent period of item where arrival is before arrival period of article in current period
        overtakenSum <- overtakenSum + 
                           sum(lt[art==articleID & period>p,arrival] < 
                               lt[.(art,p),arrival])
     }
print(overtakenSum)
}

对于我需要考虑的文章和周期的数量来说,实现速度太慢了。

有没有办法

  • 矢量化这些操作(如一些高级使用 diff(或
  • 利用 Data.table 中的特殊功能?
我不知道

如何避免问题的基本按行部分,因为每行的各种总和似乎彼此没有关系。但是,通过简单地重写您的解决方案,我看到大约 3 倍的加速:

lt[, {perArt = .SD; # renaming, to be able to run the next line correctly
      perArt[, sum(perArt[period > p, arrival] < arrival), by = .(p = period)][, sum(V1)]}
   , by = articleID][, cumsum(V1)]
#[1] 1450 2599 3760

相关内容

  • 没有找到相关文章

最新更新