假设我有一个对称矩阵:
> 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.tri
或lower.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
答案 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)