根据列及其各自的组对 R 矩阵进行排序

问题描述 投票:0回答:1

我有一个现有的块对角协方差矩阵,我想以块结构易于可见的方式对它进行排序(一些函数,如 blockdiag 自动执行此操作,但我继承了一个不这样做的过程)。也就是说,现在我的行和列不按各个块的顺序排列。

我有2组:

第 1 组:“a”、“b”

第 2 组:“c”、“d”

我想要的是这样的:

  a  b  c  d
a 1  3  0  0
b 9 11  0  0
c 0  0  6  8
d 0  0 14 16
r matrix seriation
1个回答
0
投票

看看

seriation
包装。

从块对角矩阵开始:

m <- diag(1:5) %x% matrix(1, 2, 2)
m
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#>  [1,]    1    1    0    0    0    0    0    0    0     0
#>  [2,]    1    1    0    0    0    0    0    0    0     0
#>  [3,]    0    0    2    2    0    0    0    0    0     0
#>  [4,]    0    0    2    2    0    0    0    0    0     0
#>  [5,]    0    0    0    0    3    3    0    0    0     0
#>  [6,]    0    0    0    0    3    3    0    0    0     0
#>  [7,]    0    0    0    0    0    0    4    4    0     0
#>  [8,]    0    0    0    0    0    0    4    4    0     0
#>  [9,]    0    0    0    0    0    0    0    0    5     5
#> [10,]    0    0    0    0    0    0    0    0    5     5

随机播放:

mm <- m[sample(1:10), sample(1:10)]
mm
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#>  [1,]    0    0    0    0    2    0    0    0    0     2
#>  [2,]    0    0    0    0    0    5    5    0    0     0
#>  [3,]    0    3    3    0    0    0    0    0    0     0
#>  [4,]    0    0    0    0    2    0    0    0    0     2
#>  [5,]    0    0    0    4    0    0    0    0    4     0
#>  [6,]    0    0    0    4    0    0    0    0    4     0
#>  [7,]    0    0    0    0    0    5    5    0    0     0
#>  [8,]    1    0    0    0    0    0    0    1    0     0
#>  [9,]    0    3    3    0    0    0    0    0    0     0
#> [10,]    1    0    0    0    0    0    0    1    0     0

对打乱后的矩阵进行序列化:

ser <- seriation::seriate(mm)
mm[ser[[1]], ser[[2]]]
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#>  [1,]    5    5    0    0    0    0    0    0    0     0
#>  [2,]    5    5    0    0    0    0    0    0    0     0
#>  [3,]    0    0    1    1    0    0    0    0    0     0
#>  [4,]    0    0    1    1    0    0    0    0    0     0
#>  [5,]    0    0    0    0    2    2    0    0    0     0
#>  [6,]    0    0    0    0    2    2    0    0    0     0
#>  [7,]    0    0    0    0    0    0    3    3    0     0
#>  [8,]    0    0    0    0    0    0    3    3    0     0
#>  [9,]    0    0    0    0    0    0    0    0    4     4
#> [10,]    0    0    0    0    0    0    0    0    4     4
© www.soinside.com 2019 - 2024. All rights reserved.