如何在矩阵上使用which()获得唯一索引

时间:2019-05-13 09:50:48

标签: r matrix

假设我有一个对称矩阵:

> mat <- matrix(c(1,0,1,0,0,0,1,0,1,1,0,0,0,0,0,0), ncol=4, nrow=4)
> mat
     [,1] [,2] [,3] [,4]
[1,]    1    0    1    0
[2,]    0    0    1    0
[3,]    1    1    0    0
[4,]    0    0    0    0
我要分析的

> which(mat==1, arr.ind=T)
     row col
[1,]   1   1
[2,]   3   1
[3,]   3   2
[4,]   1   3
[5,]   2   3

现在的问题是:我如何不考虑重复的单元格?如结果索引矩阵所示,我在第2行和第4行分别指向(3,1)和(1,3),它们是同一单元格。

如何避免这种情况?即使矩阵是对称的,我也只需要为每个单元格提供参考。有一种简单的方法来应对这种情况吗?

编辑:

我当时正在考虑使用upper.trilower.tri,但是在这种情况下,我得到的是矩阵的向量版本,而我无法回到(row,col)表示法。

> which(mat[upper.tri(mat)]==1, arr.ind=T)
[1] 2 3

EDIT II

预期的输出在(row,col)和(col,row)的夫妇中​​将是唯一的:

     row col
[1,]   1   1
[2,]   3   1
[3,]   3   2

1 个答案:

答案 0 :(得分:2)

因为您有对称矩阵,所以可以做

which(mat == 1 & upper.tri(mat, diag = TRUE), arr.ind = TRUE)

#     row col
#[1,]   1   1
#[2,]   1   3
#[3,]   2   3

OR

which(mat == 1 & lower.tri(mat, diag = TRUE), arr.ind = TRUE)