私は 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