Fabian Stolz
Fabian Stolz

Reputation: 2095

Repeating a repeated sequence

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?

Upvotes: 23

Views: 49229

Answers (5)

IRTFM
IRTFM

Reputation: 263352

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

Upvotes: 61

TheSciGuy
TheSciGuy

Reputation: 1196

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.

Upvotes: 9

lmo
lmo

Reputation: 38500

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

Upvotes: 1

Dieter Menne
Dieter Menne

Reputation: 10215

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

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

Upvotes: 20

Stef Sijben
Stef Sijben

Reputation: 153

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.

Upvotes: 2

Related Questions