如何在R中的矩阵中找到互补行

Ale*_*lex 5 r matrix

我有这个矩阵:

      [,1] [,2] [,3] [,4]
 [1,]    1    0    0    0
 [2,]    0    1    0    0
 [3,]    0    0    1    0
 [4,]    0    0    0    1
 [5,]    1    1    0    0
 [6,]    0    0    1    1
 [7,]    1    0    1    0
 [8,]    0    1    0    1
 [9,]    1    1    1    1
Run Code Online (Sandbox Code Playgroud)

因此,有一些行是互补的。在这个矩阵中,这些是:

[5,]    1    1    0    0
[6,]    0    0    1    1
Run Code Online (Sandbox Code Playgroud)

[7,]    1    0    1    0
[8,]    0    1    0    1
Run Code Online (Sandbox Code Playgroud)

我想要做的是找到这些互补的行并只保留其中的第一个。预期的输出应该是这样的:

      [,1] [,2] [,3] [,4]
 [1,]    1    0    0    0
 [2,]    0    1    0    0
 [3,]    0    0    1    0
 [4,]    0    0    0    1
 [5,]    1    1    0    0
 [6,]    1    0    1    0
 [7,]    1    1    1    1
Run Code Online (Sandbox Code Playgroud)

有没有办法在R中做到这一点?

Bas*_*bo1 5

如果您的矩阵被称为m

# find duplicate rows
dists <- as.matrix(dist(m, method = "manhattan"))
equals <- which(dists == ncol(m), arr.ind = TRUE, useNames = FALSE)

# remove symmetry (5,6 == 6,5)
equals <- equals[equals[,1] < equals[,2],]
to_drop <- equals[,2]

m <- m[-to_drop,]
Run Code Online (Sandbox Code Playgroud)

这使用曼哈顿距离来查找差值总和等于列数的行,因此所有元素都不同。