在R中添加数字以表示data.table列

时间:2013-03-19 10:57:47

标签: r datetime data.table

我一直在使用data.table几乎所有我使用data.frames的东西,因为它在大内存数据(几百万行)上要快得多。但是,我不太确定如何在不使用apply的情况下向IDate列添加日期或月份(这非常慢)。

一个最小的例子:

dates = c("2003-01-01", "2003-02-01", "2003-03-01", "2003-06-01", "2003-12-01", 
          "2003-04-01", "2003-05-01", "2003-07-01", "2003-09-01", "2003-08-01")
dt = data.table(idate1=as.IDate(dates))

现在,让我们说我想创建一个提前6个月的日期列。通常,对于单个IDate,我会这样做:

seq(dt$idate1[1],by="6 months",length=2)[2]

但这不会起作用,因为=必须是长度1:

dt[,idate2:=seq(idate1,by="6 months",length=2)[2]]

有没有一种有效的方法来在dt中创建列idate2?

非常感谢, RR

2 个答案:

答案 0 :(得分:2)

一种方法是使用mondate包并将月份添加到其中,然后将其转换回iDate类对象。

require(mondate)
dt = data.table(idate1=as.IDate(dates))
dt[, idate2 := as.IDate(mondate(as.Date(idate1)) + 6)]

#         idate1     idate2
#  1: 2003-01-01 2003-07-01
#  2: 2003-02-01 2003-08-02
#  3: 2003-03-01 2003-09-01
#  4: 2003-06-01 2003-12-02
#  5: 2003-12-01 2004-06-01
#  6: 2003-04-01 2003-10-02
#  7: 2003-05-01 2003-11-01
#  8: 2003-07-01 2004-01-01
#  9: 2003-09-01 2004-03-02
# 10: 2003-08-01 2004-02-01

虽然,我认为可能还有其他更好的解决方案。

答案 1 :(得分:2)

您可以使用lubridate

 library(lubridate)
 dt[, idate2 := as.IDate(idate1 %m+% months(6))]
        idate1     idate2
 1: 2003-01-01 2003-07-01
 2: 2003-02-01 2003-08-01
 3: 2003-03-01 2003-09-01
 4: 2003-06-01 2003-12-01
 5: 2003-12-01 2004-06-01
 6: 2003-04-01 2003-10-01
 7: 2003-05-01 2003-11-01
 8: 2003-07-01 2004-01-01
 9: 2003-09-01 2004-03-01
10: 2003-08-01 2004-02-01