R 中两个向量中每个向量的 [1, 2, 3, ..., n] 元素的排列和组合

permutations and combinations of [1, 2, 3, ..., n] elements for each of two vectors in R

也许这样说是错误的,但我需要两个向量元素组合的所有可能排列,使用 R。这与我能找到的任何问题都不一样。

这两个向量总是等长的。假设我们有这些向量(这些是某处两个数据帧中案例的唯一 ID 号):

vector1 <- 1:3
vector2 <- 1:3

nvec <- length(vector1)

我想要结束的是:

1    1
1    2
1    3
1    [1,2]
1    [1,3]
1    [2,3]
1    [1,2,3]
2    1
... and so on

然后它继续处理第一个向量的两个元素:

[1,2]    1
[1,2]    2
[1,2]    3
[1,2]    [1,2]
[1,2]    [1,3]
[1,2]    [2,3]
[1,2]    [1,2,3]
[1,3]    1
... and so on

依此类推,直到结束:

[1,2,3]  [1,2,3]

如何对任何给定长度的向量进行这种排列加组合?有时我需要为长度为 2 的向量提供所有这些组合,但对于长度为 10 的向量我也需要它。(我意识到我的 CPU 可能会遇到困难。)

--------------------

这是我到目前为止所做的:

从每个向量中获取一个元素,并获取所有排列:

library(gtools)
res <- permutations(nvec, 2, repeats.allowed=TRUE)
res
     [,1] [,2]
 [1,]    1    1
 [2,]    1    2
 [3,]    1    3
 [4,]    2    1
 [5,]    2    2
 [6,]    2    3
 [7,]    3    1
 [8,]    3    2
 [9,]    3    3

所以这两列代表了两个原始向量的元素个数,都是两者可能的组合。太好了。

但我还需要 vector1 的 2 个元素和 vector2 的 1 个元素的所有排列。

# these are all unique combinations of the elements in vector1: three in total

combinations(nvec, 2) 

     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    2    3

(1,2),(1,3),(2,3)我当然可以自己想出来。但是我也想为更大的向量做这个,所以它变得更加困难,我需要这样的功能。

所以现在我想置换 vector1 的 2 个元素与 vector2 的 1 个元素的这三个组合。所以结果应该是这样的:

[1, 2]    1
[1, 2]    2
[1, 2]    3
[1, 3]    1
[1, 3]    2
[1, 3]    3
[2, 3]    1
[2, 3]    2
[2, 3]    3

然后对 vector1 的所有三个元素和 vector2 的 1 个元素执行相同的操作,得到:

[1, 2, 3]  1
[1, 2, 3]  2
[1, 2, 3]  3

但我还需要 vector1 的 1 个元素和 vector2 的 2 个元素的所有排列:

1   [1, 2] 
2   [1, 2] 
3   [1, 2] 
1   [1, 3] 
2   [1, 3] 
3   [1, 3] 
1   [2, 3] 
2   [2, 3] 
3   [2, 3] 

以及每个两个元素的所有组合:

[1, 2]   [1, 2]
[1, 2]   [1, 3]
[1, 2]   [2, 3]  
[1, 3]   [1, 2]
[1, 3]   [1, 3]
[1, 3]   [2, 3]  
[2, 3]   [1, 2]
[2, 3]   [1, 3]
[2, 3]   [2, 3]

还有 vector1 的两个元素和 vector2 的所有三个元素的所有组合,反之,vector1 的三个元素和 vector2 的两个元素的所有组合。

最后我需要将它拼接在一起(并排序)。但也许我完全走错了路。

这是一个生成嵌套列表的方法:

# test vectors
vec1 <- 1:3
vec2 <- 4:6
# create all combinations of vector elements by length as nested list
comboList1 <- lapply(1:length(vec1), function(i) combn(vec1, i, simplify=FALSE))
comboList2 <- lapply(1:length(vec2), function(i) combn(vec2, i, simplify=FALSE))

# get fairly nested list of the Cartesian product of these lists
rapply(comboList1, function(i) rapply(comboList2, function(j) list(i, j), 
       how="list"), how="list")

作为更简洁的阅读清单,您可以使用unlist,如下所示:

# use unlist the results of combn to simplify results
comboList1 <- unlist(comboList1, recursive=FALSE)
comboList2 <- unlist(comboList2, recursive=FALSE)
# now use lapply:
unlist(lapply(vec1, function(i) lapply(vec2, function(j) return(list(i, j)))), recursive=FALSE)

unlist 的最终使用使列表变平,产生了一个两级列表,其中第二级是向量的比较。这是尽可能简化的。