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