2010-11-26 10 views
5

Esta es mi primera publicación. Disculpas de antemano si mi pregunta es tonta. Soy nuevo en la programación.Dividir matriz y volver a unir

Ok, entonces tengo una a matrix(eBpvalues) en R que tiene 152720 filas y 2 columnas. Quiero dividirme en 10 matrices separadas que contienen 15272 filas cada una.

He intentado esto con:

> newmx <-split(as.data.frame(eBpvalues), rep(1:10, each = 15272))) 

> summary(newmx) 

    Length Class  Mode 
1 2  data.frame list  
2 2  data.frame list 
3 2  data.frame list 
4 2  data.frame list 
5 2  data.frame list 
6 2  data.frame list 
7 2  data.frame list 
8 2  data.frame list 
9 2  data.frame list 
10 2  data.frame list 

¿Cómo hago para unirse a estas matrices de lado a lado de modo que tengo una nueva matriz con 20 columnas y filas 15272?

Saludos,

Neil

+0

@ user521469: Como Gavin lo mostró, debe incluir un ejemplo reproducible en sus preguntas. De esta forma, no tenemos que adivinar cómo son tus datos. –

+0

OK. Lo haré en el futuro – nrhorner

Respuesta

9

Usted está casi allí. Una función de uso frecuente en estas situaciones es do.call, que toma una función que desea aplicar y una lista de datos para aplicarla. La función que desea aplicar es cbind a columna vincula los 10 marcos de datos/matrices juntas.

Tomando literalmente, comenzamos con una matriz mat (eBpvalues en su Q), del tamaño apropiado. Convertir a una trama de datos:

mat <- matrix(rnorm(152720 * 2), ncol = 2) 
df <- data.frame(mat) 

Una manera fácil de producir un factor indicador es a través de la función gl():

ind <- gl(10, 15272) 

Entonces tenemos su split() llamada:

newMat <- split(df, ind) 

La última paso es este, donde nos do.call() para aplicar cbind() al conjunto de marcos de datos en newMat:

res <- do.call(cbind, newMat) 

Esto nos proporciona lo que usted quería (aunque es posible que necesite ordenar los nombres de las columnas, etc.).

> str(res) 
'data.frame': 15272 obs. of 20 variables: 
$ 1.X1 : num -0.268 -0.8568 -0.0267 1.0894 1.5847 ... 
$ 1.X2 : num 0.71 -0.298 0.359 0.97 -2.158 ... 
$ 2.X1 : num -0.987 -0.222 2.991 0.443 0.228 ... 
$ 2.X2 : num -2.343 -1.023 -1.48 1.47 0.758 ... 
$ 3.X1 : num -0.305 -0.761 0.817 1.347 0.694 ... 
$ 3.X2 : num -0.0915 0.4816 1.4662 -1.2668 -1.3523 ... 
$ 4.X1 : num -0.678 -1.056 1.029 -0.468 0.836 ... 
$ 4.X2 : num -0.656 -0.459 -0.965 -1.666 0.877 ... 
$ 5.X1 : num -0.295 -1.255 1.395 -1.985 -1.71 ... 
$ 5.X2 : num 1.141 1.177 -1.003 -0.29 -0.234 ... 
$ 6.X1 : num -0.0548 1.8673 -1.5388 -1.1063 0.3923 ... 
$ 6.X2 : num -1.399 0.57 0.367 -0.811 -2.434 ... 
$ 7.X1 : num 0.389 -1.058 0.61 1.102 -0.063 ... 
$ 7.X2 : num 0.854 1.251 1.095 -0.485 0.451 ... 
$ 8.X1 : num -2.018 0.849 0.3 0.988 -1.993 ... 
$ 8.X2 : num -1.23 -1.025 -0.546 1.674 0.588 ... 
$ 9.X1 : num 0.814 0.726 1.04 0.985 1.781 ... 
$ 9.X2 : num -1.094 -1.051 0.749 1.426 0.402 ... 
$ 10.X1: num 0.3786 1.6131 -0.4149 0.0684 -0.815 ... 
$ 10.X2: num 0.383 -0.136 -0.751 -0.164 0.434 ... 
+0

¡Hizo el trabajo! Muchas gracias. He estado luchando con eso por un tiempo. – nrhorner

+2

thx para el puntero a gl(). Sigo olvidándome de esa función. –

4

Usando índices, puede hacer esto fácilmente sin el comando dividir, usando el hecho de que R llena las matrices en forma de columna.

Un ejemplo de juguete:

> eBpvalues <- matrix(1:100,ncol=2) # a matrix with 2 cols and 50 values 
> id <- c(1,11)+rep(0:9,each=2) 
> id 
[1] 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 
> tt <- matrix(eBpvalues,ncol=20)[,id] 
> tt # a matrix with the 2 cols split up and binded rowwise 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] 
[1,] 1 51 6 56 11 61 16 66 21 71 26 76 31 81 36 86 41 91 46 96 
[2,] 2 52 7 57 12 62 17 67 22 72 27 77 32 82 37 87 42 92 47 97 
[3,] 3 53 8 58 13 63 18 68 23 73 28 78 33 83 38 88 43 93 48 98 
[4,] 4 54 9 59 14 64 19 69 24 74 29 79 34 84 39 89 44 94 49 99 
[5,] 5 55 10 60 15 65 20 70 25 75 30 80 35 85 40 90 45 95 50 100 

Esto le da una matriz de nuevo. Si usa split, puede usar la solución de Gavin. Esto convierte todo en marcos de datos, que pueden tener efectos secundarios no deseados. Ser bastante más lento en matrices grandes para empezar.

+0

Muchas gracias Joris – nrhorner

Cuestiones relacionadas