我有一个矢量,说vec1,另一个矢量vec2如下:
vec1 = c(4,1) # [1] 4 1 vec2 = c(5,3,2) # [1] 5 3 2
我正在寻找的是vec1和vec2的所有可能的组合,同时保持向量元素的顺序.也就是说,得到的矩阵应该是这样的:
> res [,1] [,2] [,3] [,4] [,5] [1,] 4 1 5 3 2 [2,] 4 5 1 3 2 [3,] 4 5 3 1 2 [4,] 4 5 3 2 1 [5,] 5 4 1 3 2 [6,] 5 4 3 1 2 [7,] 5 4 3 2 1 [8,] 5 3 4 1 2 [9,] 5 3 4 2 1 [10,] 5 3 2 4 1 # res=structure(c(4,4,5,1,# 3,2,# 2,1),.Dim = c(10L,5L))
两个向量不允许重复.也就是说,所得到的矩阵的所有行都具有唯一的元素.
我实际上正在寻找最有效的方式.解决这个问题的一种方法是生成长度为n的所有可能的排列(n = 5),然后应用过滤.但是,随着n的增长,它是耗时的.
有没有办法做到这一点?
解决方法
尝试这个:
nv1 <- length(vec1) nv2 <- length(vec2) n <- nv1 + nv2 result <- combn(n,nv1,function(v) {z=integer(n);z[v]=vec1;z[-v]=vec2;z})
这个想法是产生所有组合的索引,以便放置vec1的元素.