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