R

时间:2016-06-09 13:55:30

标签: r combinations permutation

也许这是说错的方式,但我需要使用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的两个元素的所有组合。

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

1 个答案:

答案 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的最终用法使列表变平,产生两级列表,其中第二级是向量的比较。这是尽可能简化的。