2012-06-24 2 views

ответ

30

Вы можете сделать это с помощью одного 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

Это должен быть принятый ответ, на мой взгляд – Andrie

2

Как это:

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

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

+3

Вы должны взглянуть на ответ Дитера - параметр «каждый» будет делать то, что вы делаете намного лучше, чем использовать призыв к sapply. – Dason

17

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

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

Это метод, использующий манипуляции с массивами с помощью 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