R:在没有对称匹配的情况下重新编码矩阵中的单元格

R: Recode cells in matrix with no symmetric match

我有一个 0 和 1 的邻接矩阵,表示平局提名。有些提名没有互换,所以矩阵是不对称的。

如果没有对称匹配,我想将单元格值从 1 重新编码为 0。

样本小矩阵:

     [,1] [,2] [,3] [,4]
[1,]    0    1    0    1
[2,]    0    0    1    0
[3,]    0    0    0    1
[4,]    1    0    1    0

所需输出:

     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    0    0    0
[3,]    0    0    0    1
[4,]    1    0    1    0

首先是数据,然后是 one-liner。将 0/1 视为逻辑和 AND 矩阵及其转置。 +() 强制转换为整数,技巧就完成了。

x <- scan(text="    0    1    0    1
    0    0    1    0
    0    0    0    1
    1    0    1    0")
x <- matrix(x, nrow = 4, byrow = TRUE)

y <- +(x & t(x))
y
#>      [,1] [,2] [,3] [,4]
#> [1,]    0    0    0    1
#> [2,]    0    0    0    0
#> [3,]    0    0    0    1
#> [4,]    1    0    1    0

reprex package (v2.0.1)

于 2022-02-09 创建

这是针对此特定情况的另一种方法。这比@ThomasIsCoding 的解决方案慢,并且不适用于 1、0 以外的数字。如果您的矩阵允许逆矩阵,则:

A <- structure(c(0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0), .Dim = c(4L, 4L))

A_inv <- solve(A)
A_inv + t(A_inv)

     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    0    0    0
[3,]    0    0    0    1
[4,]    1    0    1    0

我们可以像下面这样使用pmin

> pmin(x,t(x))
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    0    0    0
[3,]    0    0    0    1
[4,]    1    0    1    0