2016-05-10 7 views
1

私は数百万行と約40列の行列を持っています。Rのパフォーマンス:行列の行の要素を並べ替える最も速い方法は何ですか?

各行の要素を値が小さくなるように並べ替える必要があります。したがって、各行の最高値を持つ要素は、最初の列になければなりません。

これを行うには、apply関数を使用できます。例えば:私は非常に大規模な行列のためにこれを行うとき

set.seed(1) 
mm <- replicate(10, rnorm(20)) #random matrix with 20 rows and 10 columns 
mm.sorted <- apply(mm,1,sort,decreasing=T) 

はしかし、このアプローチは非常に長い時間がかかります。

行の要素のソートを高速化するさまざまな方法があるのだろうかと思います。

+1

ここでは、並列化に関するガイダンスを見ることができます:https://cran.r-project.org/web/views/HighPerformanceComputing.html私はそれが 'lapply(split(mm、row(mm) )、)sort) '' lapply'をmclapplyのようないくつかの亜種に置き換えます。 – Frank

+1

FYI - 'replicate(10、rnorm(20))]'は20行10列の行列です。 – rbm

+0

@rbm:ありがとう!修正しました。 –

答えて

6

をスピードアップするために:あなたは、長い形式のdata.tableとしてそれを保つことができれば

set.seed(1) 
mm <- matrix(rnorm(1000000*40,0,10),ncol=40) 
library(data.table) 
system.time({ 
    d <- as.data.table(mm) 
    d[, row := .I] 
    d <- melt(d, id.vars = "row") #wide to long format 
    setkey(d, row, value) #sort 
    d[, variable := paste0("V", ncol(mm):1)] #decreasing order 

    #back to wide format and coerce to matrix 
    msorted <- as.matrix(dcast(d, row ~ variable)[, row := NULL]) 
}) 
#user system elapsed 
#4.96 0.59 5.62 

を(すなわち、スキップ最後のステップ)、私のマシンでは約2秒かかります。比較のために

、私のマシン上@qjgods'答えのタイミング:

#user system elapsed 
#3.71 2.08 8.81 

注意apply(またはそれのパラレルバージョン)を使用すると、行列を転置こと。

+0

私はreshape2 ::: melt.matrixがどのように最適化されているのか分かりませんが、それは 'd = melt(mm);のような最初のいくつかのステップの別のオプションかもしれません。 setDT(d、key = c( "row"、 "value")) '。そして、戻ってくる道には、「まるで」か何かがあるかもしれません – Frank

7

使用並列パッケージあなたは、パッケージdata.table使用することができ

library(parallel) 
data<-matrix(rnorm(1000000*40,0,10),ncol=40) 
cl <- makeCluster(8) # 8 is the number of CPU 
system.time({ 
    parApply(cl,data,1,sort,decreasing=T) 
}) 
    user system elapsed 
    9.68 10.11 29.87 
stopCluster(cl) 
関連する問題