Ответ 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
Мы хотим получить массив, который выглядит так:
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
Каков самый простой способ сделать это?
Вы можете сделать это с помощью одного вызова 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
Или, проще (если вы имеете в виду вектор, а не массив)
rep(rep(1:4,each=3),3)
Вот так:
rep(sapply(1:4, function(x) {rep(x, 3)}), 3)
rep (x, N) возвращает вектор, повторяющий x N раз. sapply применяет данную функцию к каждому элементу вектора 1: 4 отдельно, повторяя каждый элемент 3 раза подряд.
Вот метод, использующий манипуляцию массивом с помощью 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