Сортировка матрицы при сохранении диагонали в R? - PullRequest
0 голосов
/ 31 января 2020

Мне было интересно, существует ли общий c способ сортировки симметричной матрицы в R, при сохранении диагональных значений.

Например, если у меня есть такая матрица:

# Create Matrix -----------------------------------------------------------
offdiag <- c(rep(1:6))
m <- matrix(NA, ncol = 4, nrow = 4,dimnames = list(c("A","B","C","D"), c("A","B","C","D")))
m[lower.tri(m)] <- offdiag
m[upper.tri(m)] <- t(m)[upper.tri(t(m))]
diag(m) <- 0
m

, которая производит это:

  A B C D
A 0 1 2 3
B 1 0 4 5
C 2 4 0 6
D 3 5 6 0

В приведенном выше примере значения C и D поделиться наибольшей ценностью. Итак, чего я пытаюсь добиться - это изменить порядок матрицы таким образом, чтобы наибольшее значение находилось в верхнем левом углу верхнего треугольника (при этом не изменяя диагонали 0).

Так что, если бы я вручную переставил матрицу вручную, конечный результат был бы:

# Create sorted matrix by hand --------------------------------------------
A <- c(2,3,0,1)
B <- c(4,5,1,0)
C <- c(0,6,2,4)
D <- c(6,0,3,5)

matr <- cbind(C,D,A,B)
rownames(matr) <- c("C","D","A","B")
matr 

, что привело бы к:

  C D A B
C 0 6 2 4
D 6 0 3 5
A 2 3 0 1
B 4 5 1 0

Что я ' Интересно, есть ли способ общей сортировки матрицы, как в моем примере для (n X n) матрицы?

1 Ответ

1 голос
/ 31 января 2020

Может быть, вы можете попробовать код ниже

q <- which(colSums(m == max(m))>0,arr.ind = T)
o <- c(q, seq(ncol(m))[-q])
mout <- m[o,o]

такой, что

> mout
  C D A B
C 0 6 2 4
D 6 0 3 5
A 2 3 0 1
B 4 5 1 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...