【发布时间】:2017-04-01 20:50:12
【问题描述】:
给定一个矩阵,比如 m,是否有任何直接的方法可以找到 m 的前 k 个值,然后准确地找到它们属于哪个列/行。我在 SO 上找不到任何内容,因此提出了这个问题。 我对上面的尝试是这样的:
set.seed(1729)
k=5 #top 5
m = matrix(round(runif(30),digits = 2),nr=10)
idx <- which(matrix(m %in% head(sort(m), k), nr = nrow(m)), arr.ind = TRUE)
print(m)
[,1] [,2] [,3]
[1,] 0.59 0.54 0.57
[2,] 0.44 0.43 0.32
[3,] 0.57 0.08 0.29
[4,] 0.35 0.58 0.24
[5,] 0.86 0.52 0.53
[6,] 0.41 0.78 0.17
[7,] 0.51 0.47 0.26
[8,] 0.15 0.81 0.49
[9,] 0.85 0.64 0.64
[10,] 1.00 0.78 0.95
print(idx)
row col
[1,] 8 1
[2,] 3 2
[3,] 4 3
[4,] 6 3
[5,] 7 3
我不确定这是否有效,因为我对矩阵的整个值进行排序而不是选择那些 k 值。我想假设 k 对于大型矩阵 m 有什么有效的方法,还有什么方法可以帮助我在想要获得前 k 列名称的情况下重复
例如:使用矩阵 mm,我需要识别具有最小值的前 2 列。在这里,对于以下情况,我期待第 1 列和第 2 列
mm = matrix(c(6,6,7,8,7,9,8,8,9), 3)
print(mm)
[,1] [,2] [,3]
[1,] 6 8 8
[2,] 6 7 8
[3,] 7 9 9
idx <- which(matrix(mm %in% head(sort(mm), 2), nr = nrow(mm)), arr.ind = TRUE)
print(idx)
row col
[1,] 1 1
[2,] 2 1
但是,在这里我只得到一列,即; 1 ,在这种情况下,输出应该是两个具有最小值的不同列,即。 1和2
【问题讨论】:
-
第一部分见this post。基本上,您使用
sort.int和partial = TRUE来加快排序速度。 -
抱歉,我的意思是
partial = 1:k。 -
感谢您的链接!它在某些方面很有用。
-
对于新部分,如果您想知道哪两列包含最低值,可能类似于
which( data.table::frank(matrixStats::colMins(mm), ties.method="dense") %in% 1:2 )
标签: r algorithm sorting matrix top-n