我有一张大合同日期表。在我的决赛桌中,我希望每个月都有一个合同有效的行。问题是我当前解决方案的速度。有没有更快的方法来实现这一目标? (我有超过1个Mio ID,不同的合同运行时间,需要几分钟。我怀疑是cbind?!)
library(data.table)
dt <- data.table(id=c(123, 345),
start=c(as.IDate("2013-01-01"), as.IDate("2012-01-01")),
end=c(as.IDate("2013-04-01"),as.IDate("2012-02-01") ))
dt[, cbind(.SD, seq(start, end, by="month")), by=id]
id start end V2
1: 123 2013-01-01 2013-04-01 2013-01-01
2: 123 2013-01-01 2013-04-01 2013-02-01
3: 123 2013-01-01 2013-04-01 2013-03-01
4: 123 2013-01-01 2013-04-01 2013-04-01
5: 345 2012-01-01 2012-02-01 2012-01-01
6: 345 2012-01-01 2012-02-01 2012-02-01
答案 0 :(得分:3)
初步想法:我能想到的一些调整。
首先,我使用seq.int
代替seq
,后者是 S3-generic 需要一些时间进行调度,对百万人群来说可能代价高昂。
其次,我使用1.9.3
(这几乎已经完成,应尽快推送到CRAN),并进行了相当多的改进。
第三,我在c(.SD, seq.int(start, end, by="month"))
中使用j
- 这是1.9.3
内部优化的,因此会更快。
实质上,请在1.9.3上尝试:
dt[, c(.SD, seq.int(start, end, by="month")), by=id]
当然,这仍然在一百万个群组中运行,因此可能仍然会更慢(尽管比之前的答案更快)。不过,我很想知道这里的加速(如果有的话)。
但真正的问题在于我们正在评估每个群组的j-expression
,而且您已经获得了一百万的&# 39; EM。如果seq.int
from
和to
参数能够处理长度为&gt;的输入,那么理想情况是什么?但是,最有可能的是,你必须编写自己的C / C ++代码来实现目标。