R中的异常测序

时间:2016-12-15 17:59:21

标签: r sequence

我想创建一个序列号的向量,例如:

1,2,3,4,5, 2,3,4,5,1, 3,4,5,1,2

因此,在序列完成后(例如,rep(seq(1,5),3)),前一序列的第一个数字现在移动到序列中的最后一个点。

3 个答案:

答案 0 :(得分:3)

%%以模数计算?

(1:5) %% 5 + 1  # left shift by 1
[1] 2 3 4 5 1

(1:5 + 1) %% 5 + 1  # left shift by 2
[1] 3 4 5 1 2

也试试

(1:5 - 2) %% 5 + 1  # right shift by 1
[1] 5 1 2 3 4

(1:5 - 3) %% 5 + 1  # right shift by 2
[1] 4 5 1 2 3

答案 1 :(得分:2)

我首先要制作一个长度超过系列长度的矩阵。

> lseries <- 5
> nreps <- 3
> (values <- matrix(1:lseries, nrow = lseries + 1, ncol = nreps))
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    4
[3,]    3    4    5
[4,]    4    5    1
[5,]    5    1    2
[6,]    1    2    3

这可能会发出警告(In matrix(1:lseries, nrow = lseries + 1, ncol = nreps) : data length [5] is not a sub-multiple or multiple of the number of rows [6]),您可以忽略它。请注意,第一个1:lseries行包含您想要的数据。我们可以使用以下方式获得最终结果:

> as.vector(values[1:lseries, ])
 [1] 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2

答案 2 :(得分:1)

这是获取每个

的矩阵的方法
matrix(1:5, 5, 6, byrow=TRUE)[, -6]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    2    3    4    5    1
[3,]    3    4    5    1    2
[4,]    4    5    1    2    3
[5,]    5    1    2    3    4

或将其转换为列表

split.default(matrix(1:5, 5, 6, byrow=TRUE)[, -6], 1:5)
$`1`
[1] 1 2 3 4 5

$`2`
[1] 2 3 4 5 1

$`3`
[1] 3 4 5 1 2

$`4`
[1] 4 5 1 2 3

$`5`
[1] 5 1 2 3 4

或带有c

的向量
c(matrix(1:5, 5, 6, byrow=TRUE)[, -6])
[1] 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4

为了多样性,这是第二种返回向量的方法:

# construct the larger vector
temp <- rep(1:5, 6)
# use sapply with which to pull off matching positions, then take select position to drop
temp[-sapply(1:5, function(x) which(temp == x)[x+1])]
[1] 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4