R:快速确定矩阵中的前k个最大值

时间:2015-03-23 23:16:40

标签: r

我想快速确定矩阵中的前k个最大值,然后将那些不是前k个最大值的值设为零,目前我计算出以下解决方案。有人可以改进这些,因为当矩阵有很多行时,这个不是那么快吗?

感谢。

mat <- matrix(c(5, 1, 6, 4, 9, 1, 8, 9, 10), nrow = 3, byrow = TRUE)
sortedMat <- t(apply(mat, 1, function(x) sort(x, decreasing = TRUE, method =    "quick")))
topK <- 2
sortedMat <- sortedMat[, 1:topK, drop = FALSE]
lmat <- mat
for (i in 1:nrow(mat)) {
  lmat[i, ] <- mat[i, ] %in% sortedMat[i, ]
}
kMat <- mat * lmat

 > mat
 [,1] [,2] [,3]
[1,]    5    1    6
[2,]    4    9    1
[3,]    8    9   10

> kMat
     [,1] [,2] [,3]
[1,]    5    0    6
[2,]    4    9    0
[3,]    0    9   10

2 个答案:

答案 0 :(得分:3)

在Rfast中,命令 sort_mat 对矩阵的列进行排序, colOrder 对每一列进行排序, colRanks 为每一列给出排名, colnth 给出每列的第n个值。我相信其中至少有一个适合您。

答案 1 :(得分:1)

您可以使用rank加快速度。如果存在联系,则必须决定打破这些的方法(例如ties.method = "random")。

kmat <- function(mat, k){
  mat[t(apply(mat, 1, rank)) <= (ncol(mat)-k)] <- 0
  mat
}
kmat(mat, 2)
##      [,1] [,2] [,3]
## [1,]    5    0    6
## [2,]    4    9    0
## [3,]    0    9   10