Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的性能:对矩阵中的行元素进行排序的最快方法是什么?_R_Performance_Sorting_Matrix_Apply - Fatal编程技术网

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

R中的性能:对矩阵中的行元素进行排序的最快方法是什么?,r,performance,sorting,matrix,apply,R,Performance,Sorting,Matrix,Apply,我有一个矩阵,有几百万行,大约40列 我想对每行中的元素进行排序,使它们的值减小。因此,每行中具有最高值的元素应位于第一列中 为此,我可以使用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) set.seed(1) mm使用并行软件包加速 library

我有一个矩阵,有几百万行,大约40列

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

为此,我可以使用
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)
set.seed(1)

mm使用并行软件包加速

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)
库(并行)

数据您可以使用包数据。表:

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 

请注意,使用
apply
(或它的并行版本)可以转换矩阵。

您可以在这里查看并行化的指导:我猜它看起来像
lappy(split(mm,row(mm)),sort)
但是用一些变体替换
lapply
,比如mclapplyFYI-
replicate(10,rnorm(20))]
是20行10列的矩阵。@rbm:谢谢!修复它。我不知道如何优化整形2:::melt.matrix,但这可能是前几个步骤的另一个选项,如
d=melt(mm);setDT(d,key=c(“行”,“值”))
。而且可能会有一个
acast
或者其他类似的方法,这是一个非常好的解决方案。但是,尽管我多次检查代码,但我无法理解setkey如何对其进行排序以及dcast如何将其转换回宽格式。你能解释一下或者建议一个教程吗?这就是设置一个键的字面意思:排序数据并将其标记为已排序。查看setkey和dcast的文档。
#user  system elapsed 
#3.71    2.08    8.81