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.
Author by
Fabian Stolz
Updated on January 05, 2022Comments
-
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 almost 12 yearsYou 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 almost 5 yearsTo further randomise the resulting vector (or change the order of the vector randomly), just do: sample(rep(seq(0,60,15), times = 3))
-
IRTFM over 2 yearsLooking 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.