Как извлечь информацию матрицы симметрии в кадр данных в R - PullRequest
2 голосов
/ 02 июля 2019

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

 cnt<-c(1,2,3,4,2,3,1,6,3,1,4,3,4,6,3,5)
 m<-matrix(cnt, nrow=4, byrow=T)
 colnames(m)<-rownames(m)<-LETTERS[1:4]
 m
  A B C D
A 1 2 3 4
B 2 3 1 6
C 3 1 4 3
D 4 6 3 5

То, что я хотел, это извлечь верхние диагональные значения в парный фрейм данных, такой как:

    A-B 2
    A-C 3
    A-D 4
    B-C 1
    B-D 6
    C-D 3

Ответы [ 2 ]

3 голосов
/ 02 июля 2019

В базе и, глядя на источник upper.tri, это можно сделать с помощью:

d <- dim(m)
tt <- which(.row(d) < .col(d), arr.ind=TRUE)
data.frame(rc=paste(rownames(m)[tt[,1]], colnames(m)[tt[,2]], sep="-"), m=m[tt])
#   rc m
#1 A-B 2
#2 A-C 3
#3 B-C 1
#4 A-D 4
#5 B-D 6
#6 C-D 3
2 голосов
/ 02 июля 2019

Мы просто заменим upper.tri на NA, melt в формате 'long' и unite столбцы

library(reshape2)
library(dplyr)
m[upper.tri(m, diag = TRUE)] <- NA
melt(m, na.rm = TRUE)  %>%
     unite(Var1, Var2, Var1)
#   Var1 value
#2   A_B     2
#3   A_C     3
#4   A_D     4
#7   B_C     1
#8   B_D     6
#12  C_D     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...