Convertir una matriz en una matriz unidimensional

110

Tengo una matriz (32X48).

¿Cómo puedo convertir la matriz en una matriz unidimensional?

Alos
fuente

Respuestas:

214

Léalo con 'scan', o simplemente haga como.vector () en la matriz. Es posible que desee transponer la matriz primero si lo desea por filas o columnas.

> m=matrix(1:12,3,4)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> as.vector(m)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
> as.vector(t(m))
 [1]  1  4  7 10  2  5  8 11  3  6  9 12
Hombre espacial
fuente
32

tratar c()

x = matrix(1:9, ncol = 3)

x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

c(x)

[1] 1 2 3 4 5 6 7 8 9
Greg
fuente
Eso es un vector, no una matriz 1-d.
hadley
hmm. Es verdad. Quizás no sea una matriz 1-d, sino un vector 1-d.
Greg
30

Si estamos hablando de data.frame, entonces debería preguntarse si las variables son del mismo tipo. Si ese es el caso, puede usar rapply o unlist, ya que data.frames son listas, en el fondo de sus almas ...

 data(mtcars)
 unlist(mtcars)
 rapply(mtcars, c) # completely stupid and pointless, and slower
aL3xa
fuente
14

array(A)o array(t(A))le dará una matriz 1-d.

Tian
fuente
12

De ?matrix: "Una matriz es el caso especial de una 'matriz' bidimensional". Simplemente puede cambiar las dimensiones de la matriz / matriz.

Elts_int <- as.matrix(tmp_int)  # read.table returns a data.frame as Brandon noted
dim(Elts_int) <- (maxrow_int*maxcol_int,1)
Joshua Ulrich
fuente
1
La tabla de lectura devuelve un marco de datos, no una matriz. ¿Seguirá funcionando sin as.matrix ()?
Brandon Bertelsen
6

Puede que sea muy tarde, de todos modos, esta es mi forma de convertir Matrix en vector:

library(gdata)
vector_data<- unmatrix(yourdata,byrow=T))

espero que ayude

hema
fuente
4

puede utilizar as.vector(). Parece que es el método más rápido según mi pequeño punto de referencia, de la siguiente manera:

library(microbenchmark)
x=matrix(runif(1e4),100,100) # generate a 100x100 matrix
microbenchmark(y<-as.vector(x),y<-x[1:length(x)],y<-array(x),y<-c(x),times=1e4)

La primera solución usa as.vector(), la segunda usa el hecho de que una matriz se almacena como una matriz contigua en la memoria y length(m)da el número de elementos en una matriz m. El tercero instancia un arrayfrom x, y el cuarto usa la función concatenar c(). También probé unmatrixa partir gdata, pero es demasiado lento para ser mencionados aquí.

Estos son algunos de los resultados numéricos que obtuve:

> microbenchmark(
        y<-as.vector(x),
        y<-x[1:length(x)],
        y<-array(x),
        y<-c(x),
        times=1e4)

Unit: microseconds
                expr    min      lq     mean  median      uq       max neval
   y <- as.vector(x)  8.251 13.1640 29.02656 14.4865 15.7900 69933.707 10000
 y <- x[1:length(x)] 59.709 70.8865 97.45981 73.5775 77.0910 75042.933 10000
       y <- array(x)  9.940 15.8895 26.24500 17.2330 18.4705  2106.090 10000
           y <- c(x) 22.406 33.8815 47.74805 40.7300 45.5955  1622.115 10000

Aplanar una matriz es una operación común en Machine Learning, donde una matriz puede representar los parámetros a aprender, pero se usa un algoritmo de optimización de una biblioteca genérica que espera un vector de parámetros. Entonces, es común transformar la matriz (o matrices) en dicho vector. Es el caso de la función R estándar optim().

David Bellot
fuente
1

Puedes usar la solución de Joshua pero creo que necesitas Elts_int <- as.matrix(tmp_int)

O para bucles:

z <- 1 ## Initialize
counter <- 1 ## Initialize
for(y in 1:48) { ## Assuming 48 columns otherwise, swap 48 and 32
for (x in 1:32) {  
z[counter] <- tmp_int[x,y]
counter <- 1 + counter
}
}

z es un vector 1d.

Brandon Bertelsen
fuente
1

Simple y rápido ya que una matriz 1d es esencialmente un vector

vector <- array[1:length(array)]
Jeff
fuente
1

Si, en cambio, tenía un data.frame (df) que tenía varias columnas y desea vectorizar, puede hacerlo

como.matriz (gl, ncol = 1)

Lee Sande
fuente