2012-06-24 14 views
10

Queremos obtener una matriz que tiene este aspecto:Repetición de una secuencia repetida

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 

¿Cuál es la forma más fácil de hacerlo?

+0

pensó en un bucle for, pero ¿no hay una manera más simple? –

Respuesta

30

Usted puede hacerlo con una sola rep llamada. Los parámetros each y times se evalúan secuencialmente con el each hecho primero.

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

Esta debería ser la respuesta aceptada, en mi opinión – Andrie

2

Como esto:

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

rep (x, N) devuelve un vector repitiendo veces x N. Sapply aplica la función dada a cada elemento del vector 1: 4 por separado, repitiendo cada elemento 3 veces consecutivamente.

+3

Debería echarle un vistazo a la respuesta de Dieter: el parámetro 'cada' haría lo que está haciendo mucho mejor que usar una llamada a Sapply. – Dason

17

O, más simple (suponiendo que quiere decir un vector, no un array)

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

Aquí es un método que utiliza la manipulación de matrices con aperm. La idea es construir una matriz que contenga los valores. Reorganícelos para que coincidan con la salida deseada utilizando aperm, y luego "despliegue" la matriz con 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 
Cuestiones relacionadas