我有一个矩阵" multiOrderPairsFlat" 2m +行和2列,其中每个单元格包含SKU描述(例如" Pipe2mSteel"或" Bushing1inS")并且希望按字母顺序对每一行进行排序,以便在每一行中,例如" Bushings1inS"在第一列和#34; Pipe2mSteel"在第二个。
但是,如果我跑:
for (i in 1:length(multiOrderPairsFlat)){
multiOrderPairsFlat[i,] <- sort(multiOrderPairsFlat[i,])
}
这需要永远,我怀疑这是解决这个问题的最快方法。您对如何更有效地解决这个问题有任何建议,例如:通过矢量化操作?
感谢您提供帮助;) 最好 seulberg1
答案 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))