4

私は data.frames を使用していたほとんどすべてに data.table を使用してきました。これは、メモリ内の大きなデータ (数百万行) ではるかに高速であるためです。ただし、適用を使用せずに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

4

2 に答える 2

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
于 2013-03-19T12:08:53.187 に答える
2

1 つの方法は、package を使用してそれに月を追加し、それをクラス オブジェクト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

ただし、他のより良い解決策があるかもしれないと思います。

于 2013-03-19T11:09:36.593 に答える