2012-04-19 11 views
8

Sperando ci sia una risposta semplice qui ma non riesco a trovarla da nessuna parte.Conversione di una matrice numerica in data.table (o data.frame)

Ho un matrice numerica con righe e colonne etichettate:

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

desidero un data.table (o un data.frame posso poi convertire) del modulo:

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 
    ... 

Qualsiasi consiglio apprezzato.

+3

ricercatori futuri: vedi il contrario qui: http://stackoverflow.com/q/9617348 – Aaron

risposta

10

Usa melt da 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

Supponendo 'M' è il tuo matrix ...

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

Esegue estremamente veloce su una grande matrice e anche si mostra un po 'su come un viene creata la matrice, come accedere alle cose al suo interno e come costruire i propri vettori.

+1

Questo è molto interessante, grazie. Tutte e tre le soluzioni pubblicate sono entro il 2% sulla mia macchina per una matrice 1k x 1k. – Chase

15

I as.table e as.data.frame funzioni insieme farà questo:

> 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, questo è nuovo su di me ... ed è raro. – John

Problemi correlati