R:使用 xtabs 创建对称矩阵

标签 r matrix

我有三个型号:M1、M2 和 M3。我逐对比较模型并获得分数。我只进行单向比较。 M1 和 M2,但不是 M2 和 M1,因为它将是相同的。我想将它们转换为对称矩阵。

我能够使用 xtabs 将数据集转换为矩阵,但它没有 M1-M1 和 M3-M3 距离。

d <- data.frame(M1 = c("M1", "M1", "M1", "M2", "M2", "M3"),
            M2 = c("M2", "M3", "M4", "M3", "M4", "M4"),
            C = c(1, 1, 4, 2, 2, 6))

dm = xtabs(C~M1+M2, data=d)


> d
  M1 M2 C
1 M1 M2 1
2 M1 M3 1
3 M1 M4 4
4 M2 M3 2
5 M2 M4 2
6 M3 M4 6
> dm
    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  0  2  2
  M3  0  0  6

我尝试将上三角形复制到下三角形,但它无法正常工作,因为它不是对称矩阵。我想知道如何包含 M1-M1 和 M3-M3 距离并使其成为对称矩阵。即使距离为 0,当我尝试将矩阵转换为 dist() 对象时会出现问题吗?

> dm[lower.tri(dm)] <- t(dm)[lower.tri(dm)]
> dm
    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  1  2  2
  M3  4  2  6

最佳答案

要获得对称矩阵,您可能需要在每个维度上设置相同的级别(M1 到 M4):

实现此目的的一种方法是将变量设置为具有相同因子水平集的因子。

d[c("M1", "M2")] <- lapply(d[c("M1", "M2")], factor, levels=unique(unlist(d[c("M1", "M2")]))) 

然后您可以像以前一样使用 xtabs,并将结果添加到结果的转置中。

dm <- xtabs(C ~ M1 + M2, data=d)

dm + t(dm)

#    M2
#M1   M1 M2 M3 M4
#  M1  0  1  1  4
#  M2  1  0  2  2
#  M3  1  2  0  6
#  M4  4  2  6  0

关于R:使用 xtabs 创建对称矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49736791/

相关文章:

java - 基质效能精度

arrays - 消除元素顺序不同的重复向量

R ggplot : Different geom_ablines in facets

r - R rmongodb try()未捕获可能由错误数据引起的错误

r - 检查变量是否是R中的数字

r - 沿日期刻度线放置网格

根据引用矩阵中的列、行名称,用 0 替换值是对称矩阵

R-查找值的唯一排列

C++ 将矩阵列映射到等级 - 位操作

java - 停止 glUseProgram()