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
我有一个 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