Кросс-матричное сравнение с мурлыканьем - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь сравнить каждый элемент списка объектов с каждым другим элементом с purrr с перекрестной матрицей в результате.

Чтобы сильно упростить задачу, скажем, я хочу сравнить числа1, 2 и 3 друг с другом и проверьте, совпадают ли они.В настоящее время мой подход заключается в следующем:

library(purrr)
vec = 1:3

cross_matrix <- cross2(vec,vec) %>%
  map_lgl(function(x){x[[1]] == x[[2]]}) %>%
  matrix(nrow = length(vec))

cross_matrix
#>       [,1]  [,2]  [,3]
#> [1,]  TRUE FALSE FALSE
#> [2,] FALSE  TRUE FALSE
#> [3,] FALSE FALSE  TRUE



# remove redundant comparisons (diagonals excluded)
cross_matrix[lower.tri(cross_matrix,diag = F)] <- NA

cross_matrix
#>      [,1]  [,2]  [,3]
#> [1,] TRUE FALSE FALSE
#> [2,]   NA  TRUE FALSE
#> [3,]   NA    NA  TRUE

# remove redundant comparisons (diagonals included)
cross_matrix[lower.tri(cross_matrix,diag = T)] <- NA

cross_matrix
#>      [,1]  [,2]  [,3]
#> [1,]   NA FALSE FALSE
#> [2,]   NA    NA FALSE
#> [3,]   NA    NA    NA

Создано в 2019-06-07 пакетом Представить (v0.2.1)

У меня есть следующие проблемы:

  1. map_lgl() выполняет вычисления 1 == 2 и 2 == 1, что может быть избыточной операцией.Как я могу опустить это?Желаемым выходным сигналом будет матрица, которая достигается при запуске cross_matrix[lower.tri(cross_matrix,diag = F)] <- NA (см. Код выше)

  2. Иногда запуск 1 == 1 и 2 == 2 не имеет смысла.Как я могу это контролировать?Требуемый результат будет представлять собой матрицу, которая достигается при запуске cross_matrix[lower.tri(cross_matrix,diag = T)] <- NA (см. Код выше)

  3. - это cross2(vec,vec) правильный подход или есть более элегантная стенография (повторение кажетсянемного неуклюже)

РЕДАКТИРОВАТЬ :

Важно, чтобы избыточные операции в вопросах 1 и 2 можно было пропустить перед они рассчитаны для сокращения времени вычислений.Кроме того, это, конечно, упрощенный пример: было бы здорово иметь решения, которые принимают тихие функции, предпочтительно с purrr.

1 Ответ

1 голос
/ 07 июня 2019

Это не специфическая 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).

...