full
最後の列と1つの列を取得するデータフレームがありますv
。v
次に、両方の列を可能な限り最速の方法で並べ替えたいと思います。full
csvから読み込まれますが、これはテストに使用できます(リアリズムのためにいくつかのNAが含まれています)。
n <- 200000
full <- data.frame(A = runif(n, 1, 10000), B = floor(runif(n, 0, 1.9)))
full[sample(n, 10000), 'A'] <- NA
v <- 1
私はv
ここに1つありますが、実際には変更される可能性があり、full
多くの列があります。
データフレーム、データテーブル、行列をそれぞれとで並べ替えてみorder
ました(このスレッドsort.list
からいくつかのアイデアを取り入れました)。これらすべてのコード:
# DATA FRAME
ord_df <- function() {
a <- full[c(v, length(full))]
a[with(a, order(a[1])), ]
}
sl_df <- function() {
a <- full[c(v, length(full))]
a[sort.list(a[[1]]), ]
}
# DATA TABLE
require(data.table)
ord_dt <- function() {
a <- as.data.table(full[c(v, length(full))])
colnames(a)[1] <- 'values'
a[order(values)]
}
sl_dt <- function() {
a <- as.data.table(full[c(v, length(full))])
colnames(a)[1] <- 'values'
a[sort.list(values)]
}
# MATRIX
ord_mat <- function() {
a <- as.matrix(full[c(v, length(full))])
a[order(a[, 1]), ]
}
sl_mat <- function() {
a <- as.matrix(full[c(v, length(full))])
a[sort.list(a[, 1]), ]
}
時間の結果:
ord_df sl_df ord_dt sl_dt ord_mat sl_mat
Min. 0.230 0.1500 0.1300 0.120 0.140 0.1400
Median 0.250 0.1600 0.1400 0.140 0.140 0.1400
Mean 0.244 0.1610 0.1430 0.136 0.142 0.1450
Max. 0.250 0.1700 0.1600 0.140 0.160 0.1600
または使用microbenchmark
(結果はミリ秒単位):
min lq median uq max
1 ord_df() 243.0647 248.2768 254.0544 265.2589 352.3984
2 ord_dt() 133.8159 140.0111 143.8202 148.4957 181.2647
3 ord_mat() 140.5198 146.8131 149.9876 154.6649 191.6897
4 sl_df() 152.6985 161.5591 166.5147 171.2891 194.7155
5 sl_dt() 132.1414 139.7655 144.1281 149.6844 188.8592
6 sl_mat() 139.2420 146.8578 151.6760 156.6174 186.5416
データテーブルの注文が優先されるようです。はるかに高速なデータフレームを使用する場合を除いて、order
との間にそれほど大きな違いはありません。sort.list
sort.list
データテーブルのバージョンでv
は、キーとして設定することも試みましたが(ドキュメントに従って並べ替えられているため)、内容v
が整数ではないため、機能させることができませんでした。
さまざまな値に対して何度も実行する必要があるため、これを可能な限り高速化するのが理想的v
です。このプロセスをさらにスピードアップする方法を誰かが知っていますか?Rcpp
また、実装を試す価値があるでしょうか?ありがとう。
誰かに役立つ場合にタイミングをとるために使用したコードは次のとおりです。
sortMethods <- list(ord_df, sl_df, ord_dt, sl_dt, ord_mat, sl_mat)
require(plyr)
timings <- raply(10, sapply(sortMethods, function(x) system.time(x())[[3]]))
colnames(timings) <- c('ord_df', 'sl_df', 'ord_dt', 'sl_dt', 'ord_mat', 'sl_mat')
apply(timings, 2, summary)
require(microbenchmark)
mb <- microbenchmark(ord_df(), sl_df(), ord_dt(), sl_dt(), ord_mat(), sl_mat())
plot(mb)