我有这个矩阵:
[,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中做到这一点?
如果您的矩阵被称为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)
这使用曼哈顿距离来查找差值总和等于列数的行,因此所有元素都不同。