首页 > 解决方案 > 如何在R中的矩阵中找到互补行

问题描述

我有这个矩阵:

      [,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

所以,有些行是互补的。在这个矩阵中,它们是:

[5,]    1    1    0    0
[6,]    0    0    1    1

[7,]    1    0    1    0
[8,]    0    1    0    1

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

      [,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

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

标签: rmatrix

解决方案


如果您的矩阵被称为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,]

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


推荐阅读