R中的性能:对矩阵中行的元素进行排序的最快方法是什么?

时间:2016-05-10 14:41:13

标签: r performance sorting matrix apply

我有一个有几百万行和大约40列的矩阵。

我想对每行中的元素进行排序,使其值减小。因此,每行具有最高值的元素应位于第一列中。

为此,我可以使用/something/*.log { daily rotate 30 compress prerotate bash -c "[[ ! \"$1\" =~ unwanted ]]" endscript } 功能。例如:

/something/(xxx).log

但是当我为一个非常大的矩阵做这个时,这种方法需要很长时间。

我想知道是否有不同的方法可以加快行中元素的排序。

2 个答案:

答案 0 :(得分:7)

使用并行包来加速

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)

答案 1 :(得分:7)

您可以使用包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 

如果你可以将它保存为长格式data.table(即跳过最后一步),我的机器上大约需要2秒钟。

为了比较,我机器上的@qjgods'答案的时间安排:

#user  system elapsed 
#3.71    2.08    8.81

请注意,使用apply(或其并行版本)会转换矩阵。