我正在尝试加快当前针对以下问题的实现速度:
在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