实际上,我一直在使用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]
但这不起作用,因为from =必须为长度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
虽然,我认为可能还有其他更好的解决方案。