如何生成一个列表,其中包含一个数字向量(N)的所有可能的排列,这些数字(N)在R中一次带有附加约束(n)?

时间:2017-04-28 16:20:33

标签: r

例如,假设我想在1:10系列中一次生成3个所有可能的排列。但是,所选择的3个数字必须按升序排列。因此,3,4,5是可以接受的,但不是5,4,3。第二个条件是它们不能跳跃,它们必须按顺序连续。因此,1,2,4是不可接受的。如何在R?

中得到这个

2 个答案:

答案 0 :(得分:2)

我们可以使用combn创建数字组合,然后通过检查行的差异等于1创建逻辑索引来对列进行子集化,并转置输出

m1 <- combn(1:10, 3)
t(m1[,colSums(diff(m1)==1)==2])
#     [,1] [,2] [,3]
#[1,]    1    2    3
#[2,]    2    3    4
#[3,]    3    4    5
#[4,]    4    5    6
#[5,]    5    6    7
#[6,]    6    7    8
#[7,]    7    8    9
#[8,]    8    9   10

答案 1 :(得分:2)

这些由序列1:3,2:4,...,8:10组成。通常,要获得1:n中所有长度为k的子序列,您可以从最小的1:k开始并继续向其元素添加1:

subseq <- function(n,k) if (1 <= k && k <= n) outer(1:k, 0:(n-k), "+")

序列在列中,已经按字典顺序排列。由于实际上没有进行排序,这是一个O(kn)算法,它是渐近最优的。

示例:subseq(10,3)生成

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    2    3    4    5    6    7    8    9
[3,]    3    4    5    6    7    8    9   10

稍微快一点的R实施可能会避免outer这样:

subseq <- function(n=10, k=3) if (1 <= k && k <= n)  matrix(rep(0:(n-k), each=k), k) + 1:k