如何找到两个向量之间的所有唯一匹配项?

问题描述 投票:0回答:2

我有两组,一组中的每个元素都可以与组中的任何元素匹配 另一套。例如,如果我有集合 {1, 2, 3} 和 {4, 5, 6},可能 组合是:

1, 4
2、5
3、6

1, 4
2、6
3、5

1, 5
2、4
3、6

1, 5
2、6
3、4

1, 6
2、4
3、5

1, 6
2、5
3、4

所以在匹配两个集合时,有 6 种可能的方式来匹配这两个集合 合并。有没有一种方法可以确定给定两个的所有可能的集合组合 任意向量?

我试过使用

tidyr::expand_grid()
,但这给出了所有可能 两个向量的组合,不受每个元素可以 仅与任何给定集合中另一个向量中的一个元素匹配。

tidyr::expand_grid(set1 = c(1, 2, 3), set2 = c(4, 5, 6))
#> # A tibble: 9 × 2
#>    set1  set2
#>   <dbl> <dbl>
#> 1     1     4
#> 2     1     5
#> 3     1     6
#> 4     2     4
#> 5     2     5
#> 6     2     6
#> 7     3     4
#> 8     3     5
#> 9     3     6

创建于 2023-02-25 与 reprex v2.0.2

r tidyr combinatorics
2个回答
4
投票

我认为你可以固定一个向量的位置,但枚举另一个向量的所有排列并将它们绑定到先前固定的向量,这样你就不会在所有组合中获得同构,例如,

> library(pracma)

> Map(cbind, list(v1), asplit(perms(v2), 1))
[[1]]
     [,1] [,2]
[1,]    1    6
[2,]    2    5
[3,]    3    4

[[2]]
     [,1] [,2]
[1,]    1    6
[2,]    2    4
[3,]    3    5

[[3]]
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    4

[[4]]
     [,1] [,2]
[1,]    1    5
[2,]    2    4
[3,]    3    6

[[5]]
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

[[6]]
     [,1] [,2]
[1,]    1    4
[2,]    2    6
[3,]    3    5

0
投票

使用

RcppAlgos::permuteGeneral
应用
FUN
操作,即
cbind
s
v2
v1
的每个排列。

RcppAlgos::permuteGeneral(v=v2, m=3, FUN=\(x) cbind(X1=v1, X2=x))
# [[1]]
#      X1 X2
# [1,]  1  4
# [2,]  2  5
# [3,]  3  6
# 
# [[2]]
#      X1 X2
# [1,]  1  4
# [2,]  2  6
# [3,]  3  5
# 
# [[3]]
#      X1 X2
# [1,]  1  5
# [2,]  2  4
# [3,]  3  6
# 
# [[4]]
#      X1 X2
# [1,]  1  5
# [2,]  2  6
# [3,]  3  4
# 
# [[5]]
#      X1 X2
# [1,]  1  6
# [2,]  2  4
# [3,]  3  5
# 
# [[6]]
#      X1 X2
# [1,]  1  6
# [2,]  2  5
# [3,]  3  4

资料:

v1 <- 1:3
v2 <- 4:6
© www.soinside.com 2019 - 2024. All rights reserved.