Это не специфическая purrr
операция, а полностью базовая операция R с использованием combn
cross_matrix <- function(vec) {
vals <- combn(vec, 2, function(x) x[1] == x[2])
mat <- matrix(NA, nrow = length(vec), ncol = length(vec))
diag(mat) <- TRUE #depending on what value you want for diagonals
mat[lower.tri(mat)] <- vals
t(mat)
}
cross_matrix(1:3)
# [,1] [,2] [,3]
#[1,] TRUE FALSE FALSE
#[2,] NA TRUE FALSE
#[3,] NA NA TRUE
cross_matrix(c(1, 2, 2, 1, 3, 4))
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] TRUE FALSE FALSE TRUE FALSE FALSE
#[2,] NA TRUE TRUE FALSE FALSE FALSE
#[3,] NA NA TRUE FALSE FALSE FALSE
#[4,] NA NA NA TRUE FALSE FALSE
#[5,] NA NA NA NA TRUE FALSE
#[6,] NA NA NA NA NA TRUE
Проверка выхода для
combn(1:3, 2)
# [,1] [,2] [,3]
#[1,] 1 1 2
#[2,] 2 3 3
Операция выполняется только для этих 3комбинации и не для всех 9 комбинаций.
Это относится к вашей проблеме 1 и проблеме 2.
1 == 2
и 2 == 1
не пересчитаны, а также само сопоставление не выполняется (1 == 1
и 2 == 2
).