也许这是说错的方式,但我需要使用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的两个元素的所有组合。
最后我需要将它拼接在一起(并排序)。但也许我在这里走错了路。
答案 0 :(得分:2)
这是一个导致嵌套列表的方法:
# 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
的最终用法使列表变平,产生两级列表,其中第二级是向量的比较。这是尽可能简化的。