11

私は最近 data.table パッケージを発見し、plyr コードの一部を置き換える必要があるかどうか疑問に思っていました。要約すると、私は plyr が本当に好きで、基本的にやりたいことはすべて達成できました。ただし、私のコードはしばらく実行され、高速化の見通しは、いくつかのテストを実行するのに十分でした. これらのテストはすぐに終了しましたが、その理由は次のとおりです。

私が plyr で頻繁に行うことは、日付を含む列でデータを分割し、いくつかの計算を行うことです。

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"]})

ただし、日付形式の列を使用しても、data.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 と Numeric の間で常に変換を行うのは良いコーディングではないと思います。だから私は何かが足りないのですか、それとも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 
4

1 に答える 1

8

これはうまくいくはずです:

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:

高速な並べ替えとグループ化のための整数ストレージを備えた日付と時刻のクラス。まだまだ実験中!

  • IDateから派生した日付クラスDateです。Dateストレージモードが整数であることを除いて、クラスと同じ内部表現を持ちます。
  • ITime1 日の整数秒数として格納される時刻クラスです。as.ITime24 時間を超える日は許可されません。ITimeは秒単位で保存されるため、オブジェクトに追加できますが、POSIXctオブジェクトに追加しないでくださいDate
  • IDateTimeは日時入力を受け取り、列dateおよびを含むデータ テーブルを返しますtime
于 2011-08-08T08:10:37.347 に答える