We want to get an array that looks like this:
1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4
What is the easiest way to do it?
You can do it with a single rep
call. The each
and times
parameters are evaluated sequentially with the each
being done first.
rep(1:4, times=3, each=3)
#[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
Or, simpler (assuming you mean a vector, not an array)
rep(rep(1:4,each=3),3)
42-'s answer will work if your sequence of numbers incrementally increases by 1. However, if you want to include a sequence of numbers that increase by a set interval (e.g. from 0 to 60 by 15) you can do this:
rep(seq(0,60,15), times = 3)
[1] 0 15 30 45 60 0 15 30 45 60 0 15 30 45 60
You just have to change the number of times you want this to repeat.
Like this:
rep(sapply(1:4, function(x) {rep(x, 3)}), 3)
rep(x, N) returns a vector repeating x N times. sapply applies the given function to each element of the vector 1:4 separately, repeating each element 3 times consecutively.
Here is a method using array manipulation with aperm
. The idea is to construct an array containing the values. Rearrange them so they match the desired output using aperm
, and then "unfold" the array with c
.
c(aperm(array(1:4, dim=c(4,3,3)), c(2, 1, 3)))
[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
来源:https://stackoverflow.com/questions/11180125/repeating-a-repeated-sequence