Как использовать which () на матрице для получения уникальных индексов - PullRequest
1 голос
/ 13 мая 2019

Предположим, у меня есть симметричная матрица:

> 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

1 Ответ

2 голосов
/ 13 мая 2019

Поскольку у вас есть симметричная матрица, вы можете сделать

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

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

ИЛИ

which(mat == 1 & lower.tri(mat, diag = TRUE), arr.ind = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...