Konwertuj macierz na tablicę jednowymiarową

110

Mam matrycę (32X48).

Jak mogę przekształcić macierz w jednowymiarową tablicę?

Alos
źródło

Odpowiedzi:

214

Wczytaj go za pomocą 'scan' lub po prostu zrób jak .vector () na macierzy. Możesz najpierw przetransponować macierz, jeśli chcesz, aby była to wiersze lub kolumny.

> 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
Spacedman
źródło
32

próbować 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
źródło
To jest wektor, a nie tablica 1-wymiarowa.
hadley,
hmm. To prawda. Być może nie tablica jednowymiarowa, ale wektor jednowymiarowy.
Greg,
30

Jeśli mówimy o data.frame, to należy zadać sobie pytanie, czy zmienne są tego samego typu? Jeśli tak jest, możesz użyć rapply lub unlist, ponieważ data.frames to listy głęboko w ich duszach ...

 data(mtcars)
 unlist(mtcars)
 rapply(mtcars, c) # completely stupid and pointless, and slower
aL3xa
źródło
14

array(A)lub array(t(A))poda tablicę 1-d.

Tian
źródło
12

Od ?matrix: „Macierz to szczególny przypadek dwuwymiarowej 'tablicy'.” Możesz po prostu zmienić wymiary macierzy / tablicy.

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
źródło
1
Odczyt tabeli zwraca ramkę danych, a nie macierz. Czy to nadal będzie działać bez as.matrix ()?
Brandon Bertelsen
6

Może być już tak późno, w każdym razie oto mój sposób na konwersję Matrixa na wektor:

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

mam nadzieję, że to pomoże

hema
źródło
4

możesz użyć as.vector(). Wygląda na to, że jest to najszybsza metoda według mojego małego testu porównawczego:

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)

Pierwsze rozwiązanie wykorzystuje as.vector(), drugie wykorzystuje fakt, że macierz jest przechowywana jako ciągła tablica w pamięci i length(m)podaje liczbę elementów w macierzy m. Trzeci tworzy wystąpienie arrayfrom x, a czwarty używa funkcji konkatenacji c(). Próbowałem też unmatrixz gdata, ale jest zbyt wolny, aby o nim tutaj mówić.

Oto niektóre z uzyskanych przeze mnie wyników liczbowych:

> 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

Spłaszczanie macierzy jest powszechną operacją w uczeniu maszynowym, gdzie macierz może reprezentować parametry do nauczenia, ale używa się algorytmu optymalizacji z biblioteki ogólnej, która oczekuje wektora parametrów. Dlatego często przekształca się macierz (lub macierze) w taki wektor. Jest to miejsce w przypadku standardowych funkcji R optim().

David Bellot
źródło
1

Możesz użyć rozwiązania Joshuy, ale myślę, że potrzebujesz Elts_int <- as.matrix(tmp_int)

Lub dla pętli:

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 jest wektorem 1d.

Brandon Bertelsen
źródło
1

Proste i szybkie, ponieważ tablica 1d jest zasadniczo wektorem

vector <- array[1:length(array)]
Jeff
źródło
1

Jeśli zamiast tego masz plik data.frame (df), który ma wiele kolumn i chcesz wektoryzować, możesz to zrobić

as.matrix (df, ncol = 1)

Lee Sande
źródło