将月份添加到R中data.table的IDate列
实际上,我一直在使用data.table处理所有我使用data.frames处理的数据,因为它在内存中的大数据(数百万行)上要快得多。但是,我不太确定如何在不使用apply的情况下向IDate列添加天数或月份(这非常慢) 一个简单的例子:将月份添加到R中data.table的IDate列,r,datetime,data.table,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
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
尽管如此,我认为可能还有其他更好的解决方案。您可以使用
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万行的data.table上几乎快了2倍!顺便说一下,dt$可以被删除,但是删除as.Date()会抛出一个警告。@RenéR,或者您可以直接使用
as.IDate(mondate(dates)+6)
来保存as.Date(.)
时间。当然,谢谢。然而,在我的实际问题中,我的100万行data.table不是由字符向量构建的!非常感谢,这非常有效!我接受了mondate的解决方案,因为它比lubridate在100万行上快2倍。@Arun很抱歉,它对我有效。我确信我已经测试过了。现在我得到的结果和你一样。