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

4
我有两个集合,每个集合中的任何一个元素都可以与另一个集合中的任何一个元素匹配。例如,如果我有集合{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

使用reprex v2.0.2于2023年2月25日创建

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

3
使用 RcppAlgos::permuteGeneral 函数将 v2 的每个排列与 v1 组合并应用一个 FUNction。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接