Предположим, у меня есть симметричная матрица:
> 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), что является одной и той же ячейкой.
Как мне избежать такой ситуации? Мне нужна только ссылка для каждой ячейки, хотя матрица симметрична. Есть ли простой способ справиться с такими ситуациями?
EDIT:
Я думал об использовании upper.tri
или lower.tri
, но в этом случае я получаю векторную версию матрицы, и я не могу вернуться к нотации (строка, столбец).
> which(mat[upper.tri(mat)]==1, arr.ind=T)
[1] 2 3
РЕДАКТИРОВАТЬ II
ожидаемый результат будет что-то вроде уникального для пары (строка, столбец) и (столбец, ряд):
row col
[1,] 1 1
[2,] 3 1
[3,] 3 2