Question

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?

Was it helpful?

Solution

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

OTHER TIPS

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top