2012-10-05 25 views
6

Al subconjunto de matrices, R se comporta de manera diferente dependiendo de si una de las dimensiones es de longitud 1 o no. Si una dimensión tiene longitud 1, esa dimensión se pierde durante la creación de subconjuntos:Subconjunto matriz R: dimensión perdida cuando su longitud es 1

ax <- array(1:24, c(2,3,4)) 
ay <- array(1:12, c(1,3,4)) 
dim(ax) 
#[1] 2 3 4 
dim(ay) 
#[1] 1 3 4 
dim(ax[,1:2,]) 
#[1] 2 2 4 
dim(ay[,1:2,]) 
#[1] 2 4 

Desde mi punto de vista, Ax y Ay son los mismos, y realizando la misma operación subconjunto de ellos debe devolver una matriz con las mismas dimensiones . Puedo ver que la forma en que R maneja los dos casos puede ser útil, pero no es deseable en el código que estoy escribiendo. Significa que cuando paso una matriz subconjuntada a otra función, la función obtendrá una matriz que le falta una dimensión, si sucediera que reduje una dimensión a la longitud 1 en una etapa anterior. (¡Entonces, en este caso, la flexibilidad de R hace que mi código sea menos flexible!)

¿Cómo puedo evitar que R pierda una dimensión de longitud 1 durante el subconjunto? ¿Hay alguna otra forma de indexación? ¿Alguna bandera para establecer?

+0

no idéntico pero tal vez de su interés: http://stackoverflow.com/questions/12196724/generally-disable-dimension-dropping-for-matrices –

Respuesta

14

Como descubriste por defecto, R elimina las dimensiones innecesarias. Añadiendo drop=FALSE mientras que la indexación puede impedir esto:

> dim(ay[,1:2,]) 
[1] 2 4 
> dim(ax[,1:2,]) 
[1] 2 2 4 
> dim(ay[,1:2,,drop = F]) 
[1] 1 2 4 
+0

Gracias, Dason. Perfecto. No hubiera adivinado que podrías hacerlo de esa manera. (Sabía que era una pregunta frecuente, pero es difícil construir una cadena de búsqueda útil para una respuesta). – Mars

+0

Pregunta de seguimiento: ¿Cómo puedo obtener esta información de sintaxis del sistema de ayuda integrado? – Mars

+0

'?" ["' Debería funcionar. O 'ayuda (" [")'. – Dason

Cuestiones relacionadas