假设我有一个对称矩阵:
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
答案 0 :(得分:3)
在 base 中,查看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
答案 1 :(得分:2)
我们只需将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