加速日期转换data.table方式

时间:2014-09-26 09:29:48

标签: r data.table

我有一张大合同日期表。在我的决赛桌中,我希望每个月都有一个合同有效的行。问题是我当前解决方案的速度。有没有更快的方法来实现这一目标? (我有超过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

1 个答案:

答案 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 fromto参数能够处理长度为&gt;的输入,那么理想情况是什么?但是,最有可能的是,你必须编写自己的C / C ++代码来实现目标。