2

最近のパッケージの導入により、dataframeさまざまなデータ構造を適切にベンチマークし、それぞれが得意とするものを強調する時が来たと思いました。私はそれぞれの長所の違いについて専門家ではないので、私の質問は、それらのベンチマークをどのように行えばよいかということです。

私が試したいくつかの(かなり粗雑な)こと:

library(microbenchmark)
library(data.table)
mat <- matrix(rnorm(10000), nrow = 100)
mat2df.base <- data.frame(mat)
library(dataframe)
mat2df.dataframe <- data.frame(mat)
mat2dt <- data.table(mat)
bm <- microbenchmark(t(mat), t(mat2df.base), t(mat2df.dataframe), t(mat2dt), times = 1000)

結果:

Unit: microseconds
                 expr      min       lq   median       uq       max
1              t(mat)   20.927   23.210   31.201   36.908   951.591
2      t(mat2df.base)  929.903  974.039  997.439 1040.814 28270.717
3 t(mat2df.dataframe)  924.957  969.093  992.683 1025.404 27255.205
4           t(mat2dt) 1749.465 1817.382 1857.903 1909.649  5347.321
4

1 に答える 1

4

私は data.table の専門家ではありませんが、その主な利点はインデックス作成にあると理解しています。そのため、さまざまなパッケージでサブセット化して速度を比較してみてください。

library(microbenchmark)
library(data.table)
mat <- matrix(rnorm(1e7), ncol = 10) 
key <- as.character(sample(1:10,1e6,replace=TRUE))
mat2df.base <- data.frame(mat)
mat2df.base$key <- key

bm.before <- microbenchmark( 
  mat2df.base[mat2df.base$key==2,] 
)

library(dataframe)
mat2df.dataframe <- data.frame(mat)
mat2df.dataframe$key <- key
mat2dt <- data.table(mat)
mat2dt$key <- key
setkey(mat2dt,key)


bm.subset <- microbenchmark( 
  mat2df.base[mat2df.base$key==2,], 
  mat2df.dataframe[mat2df.dataframe$key==2,],
  mat2dt["2",]
  )

                                       expr       min        lq    median   

    uq       max
1           mat2df.base[mat2df.base$key == 2, ] 153.99596 154.98602 155.91621 157.0894 194.24456
2 mat2df.dataframe[mat2df.dataframe$key == 2, ] 153.63907 154.66295 155.68553 156.9827 173.76913
3                                 mat2dt["2", ]  15.51085  15.66742  15.72899  15.8463  22.53044

行列が十分に大きい場合、data.table は他のオプションでテーブルを消去します。

また、 @RJ- のベース data.frame のパフォーマンスをパッケージdataframeの data.frames と比較しようとする試みが機能していないと思われます。パフォーマンスはあまりにも似ており、結果はロードされたライブラリの結果であり、ベースのものではないのではないかと思います.

編集:テスト済み。大した違いはないようです。bm.after は上記の bm.subset と同じコードです。正確な比較を行うために bm.before と同時に実行するだけです。

bm.before <- microbenchmark( 
  mat2df.base[mat2df.base$key==2,] 
)

> bm.after
Unit: milliseconds
                                           expr       min        lq    median        uq       max
1           mat2df.base[mat2df.base$key == 2, ] 160.62708 166.25787 167.52325 169.18710 173.47864
2 mat2df.dataframe[mat2df.dataframe$key == 2, ] 163.30259 166.00588 167.80138 169.24647 174.05713
3                                 mat2dt["2", ]  16.16117  16.89627  17.09047  17.37057  62.01954

> bm.before
Unit: milliseconds
                                 expr     min       lq   median       uq      max
1 mat2df.base[mat2df.base$key == 2, ] 159.178 160.9867 162.1149 164.0046 195.9501
于 2012-05-23T14:14:56.827 に答える