Один вариант без использования пакетов
transform(as.data.frame.table(m1), Comp =
paste(Var1, Var2, sep="-"), Val = Freq)[c("Comp", "Val")]
# Comp Val
#1 A-A 1.0
#2 B-A 0.3
#3 C-A 0.7
#4 A-B 0.3
#5 B-B 1.0
#6 C-B 0.5
#7 A-C 0.7
#8 B-C 0.5
#9 C-C 1.0
Или просто скопируйте dimnames и преобразуйте матрицу в вектор с c
data.frame(Comp = paste(row.names(m1)[row(m1)],
colnames(m1)[col(m1)], sep= '-'), Val = c(m1))
Если мы только lower.tri
angular значения
Val <- m1[lower.tri(m1, diag = TRUE)]
Comp <- paste(row.names(m1)[col(m1)],
colnames(m1)[row(m1)], sep= '-')[lower.tri(m1, diag = TRUE)]
data.frame(Comp, Val)
# Comp Val
#1 A-A 1.0
#2 A-B 0.3
#3 A-C 0.7
#4 B-B 1.0
#5 B-C 0.5
#6 C-C 1.0
или с использованием tidyverse
library(dplyr)
library(tidyr)
as.data.frame.table(m1) %>%
unite(Comp, Var1, Var2, sep='-')
# Comp Freq
#1 A-A 1.0
#2 B-A 0.3
#3 C-A 0.7
#4 A-B 0.3
#5 B-B 1.0
#6 C-B 0.5
#7 A-C 0.7
#8 B-C 0.5
#9 C-C 1.0
или с melt
library(data.table)
setDT(melt(m1))[, Comp := paste(Var1, Var2, sep="-")]
данные
m1 <- structure(c(1, 0.3, 0.7, 0.3, 1, 0.5, 0.7, 0.5, 1), .Dim = c(3L,
3L), .Dimnames = list(c("A", "B", "C"), c("A", "B", "C")))