2012-02-04 10 views
5

Lo siento, no se me ocurrió un título más informativo, pero este es mi desafío. Tengo una matriz y necesito agregar columnas en lugares específicos en función de los parámetros descritos por un vector. Por ejemplo, si tengo la matriz siguiente:Cómo agrego columnas para expandir una matriz en R

1, 0, 1, 2, 0 
0, 0, 1, 1, 1 
1, 1, 0, 0, 0 
2, 0, 1, 0, 2 

pero para un paquete de R en particular (no marcado), necesito añadir columnas de NA en lugar específico. Tengo un vector que relaciona las columnas de la matriz:

1, 1, 1, 2, 3 

que indica que las columnas 1-3 eran del mismo período de muestreo y las columnas 4 y 5 eran de diferentes períodos de muestreo. Necesito hacer que el número de columnas en la matriz sea igual al número máximo del mismo período de muestreo multiplicado por el número de períodos de muestreo. En este caso, hay tres 1s (número máximo de cualquier valor único en el vector) y un total de tres períodos de muestreo (número máximo en el vector). Entonces necesito una matriz con 9 columnas (3 x 3). Específicamente, necesito agregar las nuevas columnas de NA después de las columnas 4 y 5. Básicamente, solo necesito que las columnas de NA sean marcadores de posición para tener una matriz donde el número de observaciones (cada columna) sea el mismo (= 3) para cada período de muestra (indicado por el número en el vector). Esto es difícil de describir, pero en este ejemplo imaginario que me gustaría terminar con:

1, 0, 1, 2, NA, NA, 0, NA, NA 
0, 0, 1, 1, NA, NA, 1, NA, NA 
1, 1, 0, 0, NA, NA, 0, NA, NA 
2, 0, 1, 0, NA, NA, 2, NA, NA 

esto podría ser descrito por un vector que parecía:

1, 1, 1, 2, 2, 2, 3, 3, 3 

a pesar de que en realidad no necesito para producir ese vector, solo la matriz. Obviamente, fue fácil agregar esas columnas en este caso, pero para mis datos tengo una matriz mucho más grande que terminará con ~ 200 columnas. Además, es probable que tenga que hacer esto para numerosos conjuntos de datos.

¿Alguien puede ayudarme con una forma de codificar esto en R para que pueda automatizar el proceso de expansión de la matriz?

¡Gracias por cualquier consejo o sugerencia!


EDIT: para hacer las cosas un poco más similar a mis datos reales que aquí hay una matriz reproducible y vector similar a mis seres actuales:

m <- matrix(rpois(120*26, 1), nrow = 120, ncol = 26) 
    v <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7) 
+0

OK, entonces usted dice que no tiene que producir el vector y, por lo tanto, no existe ... ¿qué información posee para indicar qué período de muestreo tiene más columnas? ¿O sabe que son los 3 primeros y que simplemente se trata de insertar dos nuevos después de cada columna adicional de su 200? – John

+0

Lo siento, siempre sabría de mi muestreo y creación de la matriz, qué período de muestreo tiene la mayor cantidad de columnas y cuántas fue eso. Esas columnas siempre serían adyacentes pero podrían ocurrir en cualquier parte de la matriz. Debido a la facilidad, probablemente siempre crearía el primer vector, solo quería decir que no necesito crear el segundo vector correspondiente a la relación final ya que siempre serían solo múltiplos de las observaciones máximas (columnas) por período primario. . – djhocking

+1

Simplemente 'cbind (mat [, 1: 3], nas, nas, mat [, 4: 5]' (usando la definición de 'nas' de la respuesta de Johns) hará para conjuntos pequeños. ¿Sus períodos de muestreo siempre están agrupados, eso ¿nunca ves '1,1,1,2,2,1,1,3,3'? Estoy pensando en funciones simples para generar las ubicaciones de las nuevas columnas NA, por lo que pregunto. también me gustaría preguntarle qué paquete o función está enviando la matriz final. A menudo, existe una mejor manera de recopilar sus datos si sabemos lo que necesita lograr. Rellenar todas esas NA probablemente no sea la mejor solución:) –

Respuesta

4

Suponiendo m es la matriz y v es el vector, se puede usar algo como

+0

Funcionó perfectamente, gracias! – djhocking

1

Para modificar la matriz del mismo modo que pedirá asumiendo la matriz es estera:

nr <- nrow(mat) 
nas <- rep(NA, nr) 
l <- lapply(4:ncol(mat), function(x) matrix(c(mat[,x],nas,nas), nrow = nr)) 
cbind(mat[,1:3], do.call(cbind,l)) 
Cuestiones relacionadas