Converta uma matriz em uma matriz unidimensional

110

Eu tenho uma matriz (32X48).

Como posso converter a matriz em um array unidimensional?

Alos
fonte

Respostas:

214

Leia com 'scan' ou apenas faça as.vector () na matriz. Você pode querer transpor a matriz primeiro, se quiser por linhas ou colunas.

> 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
Astronauta
fonte
32

experimentar 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
fonte
Isso é um vetor, e não uma matriz 1-d.
hadley
Hmm. Isso é verdade. Talvez não seja uma matriz 1-d, mas um vetor 1-d.
Greg
30

Se estamos falando sobre data.frame, você deve se perguntar se as variáveis ​​são do mesmo tipo? Se for esse o caso, você pode usar rapply, ou unlist, já que data.frames são listas, no fundo de suas almas ...

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

array(A)ou array(t(A))fornecerá uma matriz 1-d.

Tian
fonte
12

De ?matrix: "Uma matriz é o caso especial de uma 'matriz' bidimensional." Você pode simplesmente alterar as dimensões da 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
fonte
1
Ler tabela retorna um data.frame, não uma matriz. Isso ainda funcionará sem as.matrix ()?
Brandon Bertelsen
6

Pode ser tão tarde, de qualquer maneira, aqui está minha maneira de converter Matrix em vetor:

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

espero que ajude

hema
fonte
4

você pode usar as.vector(). Parece que é o método mais rápido de acordo com meu pequeno benchmark, da seguinte maneira:

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)

A primeira solução usa as.vector(), a segunda usa o fato de que uma matriz é armazenada como um array contíguo na memória e length(m)fornece o número de elementos em uma matriz m. O terceiro instancia um arrayde xe o quarto usa a função concatenar c(). Eu também tentei unmatrixa partir gdata, mas é muito lento para ser mencionado aqui.

Aqui estão alguns dos resultados numéricos que obtive:

> 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

O achatamento de uma matriz é uma operação comum em Aprendizado de Máquina, onde uma matriz pode representar os parâmetros a serem aprendidos, mas se usa um algoritmo de otimização de uma biblioteca genérica que espera um vetor de parâmetros. Portanto, é comum transformar a matriz (ou matrizes) em tal vetor. É o caso da função R padrão optim().

David Bellot
fonte
1

Você pode usar a solução de Joshua, mas acho que você precisa Elts_int <- as.matrix(tmp_int)

Ou loops:

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 é um vetor 1d.

Brandon Bertelsen
fonte
1

Simples e rápido, pois uma matriz 1d é essencialmente um vetor

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

Se, em vez disso, você tiver um data.frame (df) com várias colunas e quiser vetorizar, pode

as.matriz (df, ncol = 1)

Lee Sande
fonte