将数月添加到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
虽然,我想可能有其他更好的解决方案。
您可以使用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
非常感谢,这工作得很好!我接受了mondate的解决方案,因为它比100万行上的lubridate快两倍。 – 2013-03-19 12:37:35
@阿伦抱歉,它适合我。我很确定我已经测试过。现在我得到和你一样的结果。 – agstudy 2013-03-19 12:54:08
非常感谢,我会因为这几乎是X2上data.table快1万行接受这个mondate解决方案! 顺便说一句,dt $内可以被删除,但删除as.Date()将会引发警告。 – 2013-03-19 12:35:30
@RenéR,的确如此。 'dt $'是不必要的。刚刚编辑。 – Arun 2013-03-19 12:37:16
@RenéR,或者你可以直接使用'as.IDate(mondate(日期)+ 6)'来保存'as.Date(。)'的时间。 – Arun 2013-03-19 12:58:52