将数月添加到data.table的IDate列中R

问题描述:

我一直在使用data.table几乎所有我使用的data.frames,因为它对于大内存数据(数百万行)来说要快得多, 。但是,我不太清楚如何在没有使用apply的情况下将数天或数月添加到IDate列(这非常缓慢)。将数月添加到data.table的IDate列中R

小例子:

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

的一种方法是使用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 

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

+0

非常感谢,我会因为这几乎是X2上data.table快1万行接受这个mondate解决方案! 顺便说一句,dt $内可以被删除,但删除as.Date()将会引发警告。 – 2013-03-19 12:35:30

+0

@RenéR,的确如此。 'dt $'是不必要的。刚刚编辑。 – Arun 2013-03-19 12:37:16

+0

@RenéR,或者你可以直接使用'as.IDate(mondate(日期)+ 6)'来保存'as.Date(。)'的​​时间。 – Arun 2013-03-19 12:58:52

您可以使用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 
+0

非常感谢,这工作得很好!我接受了mondate的解决方案,因为它比100万行上的lubridate快两倍。 – 2013-03-19 12:37:35

+0

@阿伦抱歉,它适合我。我很确定我已经测试过。现在我得到和你一样的结果。 – agstudy 2013-03-19 12:54:08