两个向量中不同数量元素的组合

Lil*_*imo 6 combinations r list

我有两个向量:

group1 <- c("a", "b")
group2 <- c("c", "d", "e")
Run Code Online (Sandbox Code Playgroud)

我想要获取“group1”中的一个元素与“group2”中的一个或两个元素的所有组合。

期望的结果是:

"a" "c" # one element from group1, one element from group 2
"b" "c"
"a" "d"
"b" "d"
"a" "e"
"b" "e"
"a" "c" "d" # one element from group1, two elements from group 2
"b" "c" "d"
"a" "c" "e"
"b" "c" "e"
"a" "d" "e"
"b" "d" "e"
Run Code Online (Sandbox Code Playgroud)

All*_*ron 4

允许任何输入向量以及从每个向量中获取的最大/最小字符数的完全通用解决方案是:

comb <- function(a, b, min_a = 1, max_a = 1, min_b = 1, max_b = 2) {
  as <- do.call(c, lapply(min_a:max_a, \(i) combn(a, i, simplify = FALSE)))
  bs <- do.call(c, lapply(min_b:max_b, \(i) combn(b, i, simplify = FALSE)))
  apply(expand.grid(as, bs), 1, unlist, use.names = FALSE)
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,这将给出:

comb(group1, group2)
#> [[1]]
#> [1] "a" "c"
#> 
#> [[2]]
#> [1] "b" "c"
#> 
#> [[3]]
#> [1] "a" "d"
#> 
#> [[4]]
#> [1] "b" "d"
#> 
#> [[5]]
#> [1] "a" "e"
#> 
#> [[6]]
#> [1] "b" "e"
#> 
#> [[7]]
#> [1] "a" "c" "d"
#> 
#> [[8]]
#> [1] "b" "c" "d"
#> 
#> [[9]]
#> [1] "a" "c" "e"
#> 
#> [[10]]
#> [1] "b" "c" "e"
#> 
#> [[11]]
#> [1] "a" "d" "e"
#> 
#> [[12]]
#> [1] "b" "d" "e"
Run Code Online (Sandbox Code Playgroud)

创建于 2022-09-03,使用reprex v2.0.2