¿Cómo hacer un subconjunto de la matriz en una columna, mantener el tipo de datos de la matriz, mantener los nombres de fila / columna?

84

Cuando subconjunto una matriz en una sola columna, el resultado es de clase numérico, no de matriz (es decir, myMatrix [, 5] para subconjunto a la quinta columna). ¿Existe una forma compacta de crear subconjuntos en una sola columna, mantener el formato de la matriz y mantener los nombres de fila / columna sin hacer algo complicado como:

matrix( myMatrix[ , 5 ] , dimnames = list( rownames( myMatrix ) , colnames( myMatrix )[ 5 ] )
SFun28
fuente

Respuestas:

122

Usa el drop=FALSEargumento para [.

m <- matrix(1:10,5,2)
rownames(m) <- 1:5
colnames(m) <- 1:2
m[,1]             # vector
m[,1,drop=FALSE]  # matrix
Joshua Ulrich
fuente
Habría jurado que vi esto recientemente, pero puede haber sido el comportamiento análogo del marco de datos lo que estaba siendo cuestionado: stackoverflow.com/questions/6941985/…
IRTFM
5
Si desea indexar solo por la primera dimensión, puede usar drop de la siguiente manera:m[1,,drop=FALSE]
Kevin Bullaughey
Para dar un ejemplo en términos estadísticos, usando las distancias D de Cook y luego seleccionando valores basados ​​en un valor de corte, por ejemplo, 0.1, se obtendrán los valores de cooksD con su número respectivo de fila en el conjunto de datos relativo cooksd<-as.data.frame(cooks.distance(ft1)) cooksD_outliers<-cooksd[cooksd>0.1,drop=FALSE,]
Elias EstatisticsEU
result <-apply (temp, 1, function (x) tapply (x, genesymbol, function (x) mean (x, na.rm = T))) Cómo lidiar con el problema ese resultado es una matriz, pero en realidad, ¿Quiero que sea un marco de datos de una columna? Gracias
Shicheng Guo
@ShichengGuo: Deberías hacer una nueva pregunta.
Joshua Ulrich