2011-08-08 4 views
10

私は最近data.tableパッケージを発見しました。私のプライベートコードの一部を置き換えるべきかどうか疑問に思っていました。要約すると、私は本当にplyrが好きで、基本的に私が望むすべてを達成しました。しかし、私のコードはしばらく時間がかかり、いくつかのテストを実行するにはスピードアップの見通しが十分でした。これらのテストはすぐに終了し、ここに理由があります。データで動作するようには思えない日付フォーマットでカラムを使用して、しかしdata.tableパッケージで日付を使用する

library(plyr) 
DF <- data.frame(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1))) 
#Split up data and apply arbitrary function 
ddply(DF, .(Date), function(df){mean(df$y) - df[nrow(df), "y"]}) 

私はplyrでかなり頻繁にやっていることはいくつかの計算を日付を含む列で自分のデータを分割して行うことです.table:

library(data.table) 
DT <- data.table(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1))) 
setkey(DT, Date) 
#Error in setkey(DT, Date) : Column 'Date' cannot be auto converted to integer without losing information. 

私が正しくパッケージを理解していれば、私はsetkey()を使うとかなり高速化されます。また、Dateと数値の間を絶えず変換するのは良いコーディングではないと思います。だから私は何かを逃しているか、それともdata.tableでそれを達成するための簡単な方法はありませんか?

これは動作するはず
sessionInfo() 
R version 2.13.1 (2011-07-08) 
Platform: x86_64-pc-mingw32/x64 (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] grid  stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] data.table_1.6.3 zoo_1.7-2  lubridate_0.2.5 ggplot2_0.8.9 proto_0.3-9.2 reshape_0.8.4 
[7] reshape2_1.1  xtable_1.5-6  plyr_1.5.2  

loaded via a namespace (and not attached): 
[1] digest_0.5.0 lattice_0.19-30 stringr_0.5  tools_2.13.1 
+1

私はdata.tableを使用していませんが、Sys.time()は 'Date'ではなくPOSIXctのdatetime値を返します。特に、返される値(1970年1月1日以降に経過した秒数)は一般的に整数値ではないため、整数に変換すると情報が失われることがあります。 –

+1

data.tableは'setkey'を使わなくても実行時間が大幅に改善されました – Andrie

答えて

7

DT <- data.table(Date=as.ITime(rep(c(Sys.time(), Sys.time() + 60), each=6)), 
       y=c(rnorm(6, 1), rnorm(6, -1))) 
setkey(DT, Date) 

data.tableパッケージは、整数のストレージモードでいくつかの日付/時間のクラスが含まれています。高速の並べ替えや グループ化のための整数のストレージを持つ

日付と時刻のクラス: ?IDateTimeを参照してください。まだ実験中!

  • IDateDate由来するDateクラスです。記憶モードが整数であることを除いて、Dateクラスと同じ内部表現を持ちます。
  • ITimeは、1日の整数秒数として格納される時刻クラスです。 as.ITimeでは、24時間より長い日数は許可されません。 ITimeは秒単位で保存されるため、POSIXctオブジェクトに追加できますが、Dateオブジェクトには追加しないでください。
  • IDateTimeは、日付時刻の入力を受け取り、datetimeという列のデータテーブルを返します。
+0

ありがとうございます。私は実際にggplot2でうまく動作するlubridateを使用しています。 3つのパッケージ(lubridate、ggplot2、plyr)はすべて同じ著者のものであり、組み合わせてうまく動作するので、スイッチを作る代わりにもう少し長くしておくと思います。しかし、あなたの答えは良い解決策を与えます。時間があるときは、私は周りを回り、data.tableを使ってスピードの向上をテストすると思います。再度、感謝します! –

関連する問題