R按行排序Matrix的有效方法

时间:2016-11-02 10:55:51

标签: r sorting matrix

我有一个矩阵" multiOrderPairsFlat" 2m +行和2列,其中每个单元格包含SKU描述(例如" Pipe2mSteel"或" Bushing1inS")并且希望按字母顺序对每一行进行排序,以便在每一行中,例如" Bushings1inS"在第一列和#34; Pipe2mSteel"在第二个。

但是,如果我跑:

for (i in 1:length(multiOrderPairsFlat)){
  multiOrderPairsFlat[i,] <- sort(multiOrderPairsFlat[i,])
}

这需要永远,我怀疑这是解决这个问题的最快方法。您对如何更有效地解决这个问题有任何建议,例如:通过矢量化操作?

感谢您提供帮助;) 最好 seulberg1

1 个答案:

答案 0 :(得分:2)

转换为pmin/pmax后使用data.frame可能更好(因为只有两列)

 system.time({
 df1 <- as.data.frame(multiOrderPairsFlat, stringsAsFactors=FALSE)
  res <- data.frame(First = do.call(pmin, df1), Second = do.call(pmax, df1))

 })
 #    user  system elapsed 
 #  0.49    0.02    0.50 

system.time({
  for (i in 1:nrow(multiOrderPairsFlat)){
    multiOrderPairsFlat[i,] <- sort(multiOrderPairsFlat[i,])
  }
 })

#  user  system elapsed 
#  11.99    0.00   12.00 

all.equal(as.matrix(res), multiOrderPairsFlat, check.attributes=FALSE)
#[1] TRUE

检查内存分配

library(profvis)

profvis({
 df1 <- as.data.frame(multiOrderPairsFlat, stringsAsFactors=FALSE)
 res <- data.frame(First = do.call(pmin, df1), Second = do.call(pmax, df1))

  })

#3.3 MB
profvis({
 for (i in 1:nrow(multiOrderPairsFlat)){
  multiOrderPairsFlat[i,] <- sort(multiOrderPairsFlat[i,])
  }
})

#12.8 MB

数据

set.seed(24)
multiOrderPairsFlat <- cbind(sample(c("Pipe2mSteel" , "Bushing1inS"), 1e6, replace=TRUE),
    sample(c("Pipe2mSteel" , "Bushing1inS"), 1e6, replace=TRUE))