с использованием xor()
:
complements <- mapply(function(x,y) { all(xor(mat[x,], mat[y,]))}, x = 1:(nrow(mat)-1), y = 2:nrow(mat) )
names(complements) <- paste(x = 1:(nrow(mat)-1), y = 2:nrow(mat), sep = '')
complements
# 12 23 34 45 56 67 78 89
# FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE
Извлечь первую строку матча:
mat[(1:(nrow(mat)-1))[complements], ]
# V1 V2 V3 V4
# [1,] 1 1 0 0
# [2,] 1 0 1 0
Извлечь вторую строка соответствия:
mat[(2:nrow(mat))[complements], ]
# V1 V2 V3 V4
# [1,] 0 0 1 1
# [2,] 0 1 0 1
РЕДАКТИРОВАТЬ:
После того, как OP отредактировал ожидаемый результат, код будет приведен ниже.
Сначала рассматривается крайний случай отсутствия комплементарности со строками 1 и 2, а затем проверяется вся матрица на дополнения.
ind <- unique( c(unlist( ifelse( all(xor(mat[1, ], mat[2, ])), 1, list(c(1,2)))),
mapply(function(x,y) { ifelse(all(xor(mat[x,], mat[y,])), x, y)}, x = 1:(nrow(mat)-1), y = 2:nrow(mat) )))
mat[ind, ]
# V1 V2 V3 V4
# [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
Данные:
mat <- structure(c(1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L,
1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L,
0L, 1L, 0L, 1L, 0L, 1L, 1L), .Dim = c(9L, 4L), .Dimnames = list(
NULL, c("V1", "V2", "V3", "V4")))