Combinações com purrr

Olá.
Nesse exemplo simples, como faríamos para remover as combinações reciprocas? Nesse experimento 2-1 (linha 1) significa a mesma cosa que 1-2 (linha 3), assim apenas um deles deve ser mantido. O mesmo vale para as demais combinações.

comb_lits = list(
  par1 = c(1:3),
  par2 = c(1:3))

purrr::cross_df(comb_lits, .filter = `==`)
#> # A tibble: 6 x 2
#>    par1  par2
#>   <int> <int>
#> 1     2     1
#> 2     3     1
#> 3     1     2
#> 4     3     2
#> 5     1     3
#> 6     2     3

Created on 2021-04-23 by the reprex package (v1.0.0)

Admito que a solução que encontrei não é muito elegante, mas não consegui achar mais nada que funcionasse. O mutate() está criando colunas temporárias em que o menor dos elementos do par está sempre na coluna tmp1; aí é só filtrar as linhas distintas e descartar o que não queremos.

library(magrittr)

comb_lits = list(
  par1 = c(1:3),
  par2 = c(1:3)
)

comb_lits %>%
  purrr::cross_df(.filter = `==`) %>%
  dplyr::mutate(
    tmp1 = pmin(par1, par2),
    tmp2 = pmax(par1, par2)
  ) %>%
  dplyr::distinct(tmp1, tmp2, .keep_all = TRUE) %>%
  dplyr::select(-tmp1, -tmp2)
#> # A tibble: 3 x 2
#>    par1  par2
#>   <int> <int>
#> 1     2     1
#> 2     3     1
#> 3     3     2

Created on 2021-04-25 by the reprex package (v2.0.0)

1 curtida