Повторение повторяющейся последовательности

Мы хотим получить массив, который выглядит так:

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

Каков самый простой способ сделать это?

Ответ 1

Вы можете сделать это с помощью одного вызова rep. Параметры each и times оцениваются последовательно с первым выполнением each.

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

Ответ 2

Или, проще (если вы имеете в виду вектор, а не массив)

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

Ответ 3

Вот так:

rep(sapply(1:4, function(x) {rep(x, 3)}), 3)

rep (x, N) возвращает вектор, повторяющий x N раз. sapply применяет данную функцию к каждому элементу вектора 1: 4 отдельно, повторяя каждый элемент 3 раза подряд.

Ответ 4

Вот метод, использующий манипуляцию массивом с помощью aperm. Идея состоит в том, чтобы построить массив, содержащий значения. Переупорядочивайте их так, чтобы они соответствовали желаемому результату с помощью aperm, а затем "разворачивали" массив с помощью 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