这似乎是一个简单的问题,但我很难以快速的方式做到这一点。
假设我有一个矩阵,我想对此矩阵进行排序,并按降序存储元素的索引。有快速的方法吗?现在,我正在提取最大值,存储结果,将其更改为-2,然后在for循环中提取下一个最大值。这可能是最低效的方式。
我的问题实际上要求我使用20,000 X 20,000矩阵。记忆不是问题。关于以最快的方式做任何想法都会很棒。
例如,如果我有一个矩阵
>m<-matrix(c(1,4,2,3),2,2)
>m
[,1] [,2]
[1,] 1 2
[2,] 4 3
我希望结果以降序显示数字:
row col val
2 1 4
2 2 3
1 2 2
1 1 1
答案 0 :(得分:4)
这是一个可能的data.table
解决方案
library(data.table)
rows <- nrow(m) ; cols <- ncol(m)
res <- data.table(
row = rep(seq_len(rows), cols),
col = rep(seq_len(cols), each = rows),
val = c(m)
)
setorder(res, -val)
res
# row col val
# 1: 2 1 4
# 2: 2 2 3
# 3: 1 2 2
# 4: 1 1 1
修改:基础R替代
res <- cbind(
row = rep(seq_len(rows), cols),
col = rep(seq_len(cols), each = rows),
val = c(m)
)
res[order(-res[, 3]),]
# row col val
# [1,] 2 1 4
# [2,] 2 2 3
# [3,] 1 2 2
# [4,] 1 1 1