R语言—将对称方阵转换为两两对应的格式
1. 需求描述
有时候会有矩阵( n*n)转换为两两对应关系的需求,例如:
Row/Column | A | B | C |
---|---|---|---|
A | 1 | 2 | 3 |
B | 2 | 3 | 4 |
C | 3 | 4 | 0 |
可以看到上面的方阵
是右上角和左下角对称
的,这样的数据可以转换为两两关系
,这样更清晰,也能更好的适应一些软件,上面的方阵可以转换为下面的六行数据
:
Column1 | Column2 | Value |
---|---|---|
A | A | 1 |
A | B | 2 |
A | C | 3 |
B | B | 3 |
B | C | 4 |
C | C | 0 |
2. R语言实现
在R语言中,借助R包reshape2
,首先随机生成一个对称方阵mat
:
> set.seed(1)
> mat=matrix(runif(16),4,4)
> mat
[,1] [,2] [,3] [,4]
[1,] 0.2655087 0.2016819 0.62911404 0.6870228
[2,] 0.3721239 0.8983897 0.06178627 0.3841037
[3,] 0.5728534 0.9446753 0.20597457 0.7698414
[4,] 0.9082078 0.6607978 0.17655675 0.4976992
> mat[lower.tri(mat)] <- t(mat)[lower.tri(mat)]
> mat
[,1] [,2] [,3] [,4]
[1,] 0.2655087 0.20168193 0.62911404 0.6870228
[2,] 0.2016819 0.89838968 0.06178627 0.3841037
[3,] 0.6291140 0.06178627 0.20597457 0.7698414
[4,] 0.6870228 0.38410372 0.76984142 0.4976992
然后将上三角阵转换为NA
,再使用reshape2::melt
函数即可:
## 替换上三角阵为NA
> mat[upper.tri(mat)] = NA
> mat
[,1] [,2] [,3] [,4]
[1,] 0.2655087 NA NA NA
[2,] 0.2016819 0.89838968 NA NA
[3,] 0.6291140 0.06178627 0.2059746 NA
[4,] 0.6870228 0.38410372 0.7698414 0.4976992
## 将下三角阵转换为两两对应的关系
> reshape2::melt(mat, na.rm=T)
Var1 Var2 value
1 1 1 0.26550866
2 2 1 0.20168193
3 3 1 0.62911404
4 4 1 0.68702285
6 2 2 0.89838968
7 3 2 0.06178627
8 4 2 0.38410372
11 3 3 0.20597457
12 4 3 0.76984142
16 4 4 0.49769924
至此,完成了对称方阵转换为两两对应关系的结果。