2012-04-19 12 views
8

Mamy nadzieję, że istnieje prosta odpowiedź, ale nie mogę jej nigdzie znaleźć.Konwertowanie macierzy numerycznej na dane.tabela (lub data.frame)

mam matrycę liczbową znakowanych wierszy i kolumn:

 1 2 3 4 
a 6 7 8 9 
b 8 7 5 7 
c 8 5 4 1 
d 1 6 3 2 

Chciałbym data.table (lub data.frame można następnie konwertować) w postaci:

col  row value 
    1  a  6 
    1  b  8 
    1  c  8 
    1  d  1 
    2  a  7 
    2  b  7 
    2  c  5 
    2  d  6 
    ... 

Wszelkie wskazówki są mile widziane.

+3

Przyszłe wyszukiwarki: patrz przeciwnego tutaj: http://stackoverflow.com/q/9617348 – Aaron

Odpowiedz

10

Zastosowanie melt z reshape2:

library(reshape2) 
#Fake data 
x <- matrix(1:12, ncol = 3) 
colnames(x) <- letters[1:3] 
rownames(x) <- 1:4 
x.m <- melt(x) 
x.m 

    Var1 Var2 value 
1  1 a  1 
2  2 a  2 
3  3 a  3 
4  4 a  4 
... 
6

Zakładając M to Twój macierz ...

data.frame(col = rep(colnames(m), each = nrow(m)), 
      row = rep(rownames(m), ncol(m)), 
      value = as.vector(m)) 

ten wykonuje bardzo szybko na dużej matrycy, a także pokazuje trochę o tym, jak Macierz jest tworzona, jak uzyskać dostęp do rzeczy w niej i jak budować własne wektory.

+1

Jest to dość ciekawe, dziękuję. Wszystkie trzy zaksięgowane rozwiązania znajdują się w granicach 2% na moim komputerze dla matrycy 1k x 1k. – Chase

15

W as.table i as.data.frame funkcje razem będzie to zrobić:

> m <- matrix(sample(1:12), nrow=4) 
> dimnames(m) <- list(One=letters[1:4], Two=LETTERS[1:3]) 
> as.data.frame(as.table(m)) 
    One Two Freq 
1 a A 7 
2 b A 2 
3 c A 1 
4 d A 5 
5 a B 9 
6 b B 6 
7 c B 8 
8 d B 10 
9 a C 11 
10 b C 12 
11 c C 3 
12 d C 4 
+0

OK +1, to jest nowe na mnie ... i to jest bardzo rzadkie. – John