我有两组,一组中的每个元素都可以与组中的任何元素匹配 另一套。例如,如果我有集合 {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
我认为你可以固定一个向量的位置,但枚举另一个向量的所有排列并将它们绑定到先前固定的向量,这样你就不会在所有组合中获得同构,例如,
> 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
使用
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