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
的最终使用使列表变平,产生了一个两级列表,其中第二级是向量的比较。这是尽可能简化的。
也许这样说是错误的,但我需要两个向量元素组合的所有可能排列,使用 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
的最终使用使列表变平,产生了一个两级列表,其中第二级是向量的比较。这是尽可能简化的。