我正在try 将列名对称的矩阵转换为更低的三角形矩阵.这与常规问题不同,因为我的矩阵没有对称的值,因此清除上半部分的值是不起作用的.这将需要对行和列进行重组.这是矩阵.

mat_before <- structure(c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 
                          0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
                          0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 
                          0, 0, 0, 0, 0), .Dim = c(8L, 8L), .Dimnames = list(c("Features",                                                                 "Innovation", "KPI", "Knowledge", "Performance", "Presence", 
                                                                               "Trust", "VFM"), c("Features", "Innovation", "KPI", "Knowledge", 
                                                                                                  "Performance", "Presence", "Trust", "VFM")))

> mat_before
            Features Innovation KPI Knowledge Performance Presence Trust VFM
Features           0          0   0         1           1        0     0   0
Innovation         0          0   0         0           0        1     0   0
KPI                0          1   0         0           1        0     1   1
Knowledge          0          0   0         0           0        1     0   0
Performance        0          0   0         1           0        1     0   0
Presence           0          0   0         0           0        0     0   0
Trust              1          0   0         0           0        0     0   0
VFM                0          1   0         0           0        0     0   0

这是重构后所需的结果(转换为下三角矩阵格式).

> matrix_result 
            Presence Knowledge Performance Innovation Features Trust VFM KPI
Presence           0         0           0          0        0     0   0   0
Knowledge          1         0           0          0        0     0   0   0
Performance        1         1           0          0        0     0   0   0
Innovation         1         0           0          0        0     0   0   0
Features           0         1           1          0        0     0   0   0
Trust              0         0           0          0        1     0   0   0
VFM                0         0           0          1        0     0   0   0
KPI                0         0           1          1        0     1   1   0

如果您有任何提示或技巧,我们将不胜感激. 编辑:我还需要这个代码可以复制到任何矩阵,这可能是对称的维度,但不同的大小和列名.

推荐答案

对行/列总和进行排序通常不起作用:

set.seed(1024646989L)
m <- matrix(0L, 10, 10, 0, rep(list(LETTERS[1:10]), 2))
tri <- lower.tri(m)
m[tri] <- sample(0:1, sum(tri), 1)
s <- order(-colSums(m))
m[s, s]
#>   A C F B E D G H I J
#> A 0 0 0 0 0 0 0 0 0 0
#> C 1 0 0 0 0 0 0 0 0 0
#> F 1 1 0 1 0 0 0 0 0 0
#> B 0 0 0 0 0 0 0 0 0 0
#> E 0 0 0 0 0 0 0 0 0 0
#> D 1 0 0 1 0 0 0 0 0 0
#> G 1 1 1 0 1 1 0 0 0 0
#> H 0 1 1 0 1 0 1 0 0 0
#> I 0 1 1 0 1 0 0 0 0 0
#> J 1 0 1 1 0 0 0 1 1 0

(注意m["F", "B"]在上面的三角形中.)

然而,directed acyclic graph的邻接矩阵在为sorted topologically时是三角形的.我们可以使用igraph::topo_sort来做到这一点:

library(igraph)

s <- rev(topo_sort(graph_from_adjacency_matrix(m)))
m[s, s]
#>   A C B F E D G I H J
#> A 0 0 0 0 0 0 0 0 0 0
#> C 1 0 0 0 0 0 0 0 0 0
#> B 0 0 0 0 0 0 0 0 0 0
#> F 1 1 1 0 0 0 0 0 0 0
#> E 0 0 0 0 0 0 0 0 0 0
#> D 1 0 1 0 0 0 0 0 0 0
#> G 1 1 0 1 1 1 0 0 0 0
#> I 0 1 0 1 1 0 0 0 0 0
#> H 0 1 0 1 1 0 1 0 0 0
#> J 1 0 1 1 0 0 0 1 1 0

R相关问答推荐

使用geom_rect的带有事件注释的时间序列图

如何设置搜索栏来搜索整个Shiny应用程序页面?

R中的Fasttext langue_identification返回太多参数-如何与文本匹配?

在ggplot Likert条中添加水平线

x[[1]]中的错误:脚注越界

根据多个条件增加y轴高度以适应geom_text标签

根据文本字符串中的值粘贴新列

在嵌套列表中查找元素路径的最佳方法

方法::slotName如何处理非类、非字符的参数?

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

在保留列表元素属性的同时替换列表元素

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

如何平滑或忽略R中变量的微小变化?

使用geom_iles在一个切片中包含多个值

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

按组和连续id计算日期差

创建新列,其中S列的值取决于该行S值是否与其他行冗余

网络抓取新闻标题和时间

数据集上的R循环和存储模型系数

是否从列中删除★符号?