我想快速确定矩阵中的前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
答案 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