如何使用R产生序列(1,2,3 ... n,2,3 ... n,3,4..n ... n-1,n)

时间:2018-09-13 02:36:25

标签: r

我不知道这叫什么,也许是嵌套的算术级数? 如果n是整数,则说n = 50,我想要的是

 (1,2,3...n,2,3...n,3,4..n...n-1,n)

就像

的串联
 1:n, 2:n, ...,n-1:n

有没有简单的方法可以做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:8)

受试者说最后一个子序列是n,但问题的正文说是(n-1):n。我假设(n-1):n,但要获得另一个,只需将代码中的每个n-1更改为n,并将代码中的每个2更改为1。

1)施加:假设我们要像这样对每个子序列的起始值进行1:n,2:n,...,(n-1):n的迭代:

n <- 4
unlist(lapply(seq_len(n-1), seq, n))
##  [1] 1 2 3 4 2 3 4 3 4

2)序列:另一种方法是像这样转换sequence(seq(n, 2))

s <- sequence(seq(n, 2))
s + cumsum(s == 1) - 1
## [1] 1 2 3 4 2 3 4 3 4

3)外部

m <- outer(seq_len(n), seq_len(n-1), ">=") * seq(n)
m[m > 0]
## [1] 1 2 3 4 2 3 4 3 4

3a)(3)的此变体形式也适用:

m <- outer(seq_len(n), seq_len(n-1), "+") - 1
m[m <= n]
## [1] 1 2 3 4 2 3 4 3 4

4)减少

f <- function(x, y) c(x, seq(y, n))
Reduce(f, 1:(n-1), c())
## [1] 1 2 3 4 2 3 4 3 4

5)递归

Recurse <- function(v) {
  if (length(v) > 2) c(v, Recall(tail(v, -1))) else v
}
Recurse(1:n)
## [1] 1 2 3 4 2 3 4 3 4

答案 1 :(得分:0)

例如,

> n <- 4
> X <- matrix(1:n, nrow = n, ncol = n)
> X
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
[4,]    4    4    4    4
> lower.tri(X, diag = TRUE)
     [,1]  [,2]  [,3]  [,4]
[1,] TRUE FALSE FALSE FALSE
[2,] TRUE  TRUE FALSE FALSE
[3,] TRUE  TRUE  TRUE FALSE
[4,] TRUE  TRUE  TRUE  TRUE
> x <- X[lower.tri(X, diag = TRUE)]
> x
 [1] 1 2 3 4 2 3 4 3 4 4
> x[-length(x)]
[1] 1 2 3 4 2 3 4 3 4