Repeating a repeated sequence

37,384

Solution 1

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)  # 'each' done first regardless of order of named parameters
#[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

Solution 2

Or, simpler (assuming you mean a vector, not an array)

rep(rep(1:4,each=3),3)

Solution 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.

Solution 4

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.

Share:
37,384
Fabian Stolz
Author by

Fabian Stolz

Updated on January 05, 2022

Comments

  • Fabian Stolz
    Fabian Stolz over 2 years

    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?

  • Dason
    Dason almost 12 years
    You should take a look at Dieter's answer - the 'each' parameter would do what you're doing a lot nicer than using a call to sapply.
  • Good Will
    Good Will almost 5 years
    To further randomise the resulting vector (or change the order of the vector randomly), just do: sample(rep(seq(0,60,15), times = 3))
  • IRTFM
    IRTFM over 2 years
    Looking at this years later, I'm not sure that it is simpler, but I think a case could be made that it is more flexible in that you could use it to perform the "times" operation first to be followed by "each" processing.