[英]R: creating a symmetric matrix with xtabs
我有三种型号:M1,M2和M3。 我成对比较模型并得到分数。 我只做单向比较。 M1和M2相同,但不是M2和M1。 我想将它们转换为一个symmetrix矩阵。
我能够使用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
添加其转置。 那给了对角线两次,所以减去它。
dm + t(dm) - diag(diag(dm))
赠送:
M2
M1 M2 M3 M4
M1 1 1 4
M2 1 2 2
M3 4 2 6
如果我们知道所有元素都是非负数,那么这也将起作用:
pmax(dm, t(dm))
为了获得对称矩阵,您可能希望在每个维度上设置相同的级别(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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.