我正在尝试在列数很少且行数很多的矩阵中对每一行进行排序。 R中有这个矢量化版本吗?更具体地说,让我们将种子设置为10并制作一个示例矩阵:
set.seed(10)
example.matrix = replicate(12,runif(500000))
要订购example.matrix,我会,
ordered.example = apply(example.matrix,1,order)
但这很慢,我会更喜欢更快的东西。 作为类比,
rowSums(example.matrix)
优先,
apply(example.matrix,1,sum)
非常感谢。
答案 0 :(得分:3)
这有点快(关键位为order(row(em), em)
):
set.seed(10)
em <- replicate(12,runif(500000))
system.time(a <- matrix(em[order(row(em), em)], nrow=nrow(em), byrow=TRUE))
# user system elapsed
# 5.36 0.12 5.80
set.seed(10)
example.matrix <- replicate(12,runif(500000))
system.time(ordered.example <- apply(example.matrix,1,order))
# user system elapsed
# 13.36 0.09 15.52
identical(a, ordered.example)
# [1] FALSE
答案 1 :(得分:3)
这是一种加速10倍的方法。它专门针对您的示例而定制,根据您的实际数据,此方法可能有效,也可能无效。
这个想法是将0添加到第一行,添加到第二行,依此类推,然后将其折叠为向量,对其进行排序,然后重新组合成矩阵:
N = 12; M = 500000; d = replicate(N,runif(M))
system.time(d1<-t(apply(d, 1, order)))
# user system elapsed
# 11.26 0.06 11.34
system.time(d2<-matrix(order(as.vector(t(matrix(as.vector(d) + 0:(M-1), nrow = M)))) -
rep(0:(M-1), each = N)*N, nrow = M, byrow = T))
# user system elapsed
# 1.39 0.14 1.53
# Note: for some reason identical() fails, but the two are in fact the same
sum(abs(d1-d2))
# 0