2012-04-19 17 views
8

Esperando que haya una respuesta simple aquí pero no puedo encontrarla en ningún lado.Conversión de una matriz numérica en un data.table (o data.frame)

I tienen una matriz numérica con filas y columnas etiquetadas:

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

me gustaría un data.table (o un data.frame puedo entonces convertir) de la forma:

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

Cualquier consejo apreciado.

+3

buscadores de futuro: ver lo contrario aquí: http://stackoverflow.com/q/9617348 – Aaron

Respuesta

10

Uso de melt 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

Suponiendo 'M' es su matriz ...

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

Esto ejecuta extremadamente rápido en una matriz grande y también muestra un poco acerca de cómo una se hace la matriz, cómo acceder a las cosas en él y cómo construir sus propios vectores.

+1

Esto es muy interesante, gracias. Las tres soluciones publicadas están dentro del 2% en mi máquina para una matriz de 1k x 1k. – Chase

15

Los as.table y as.data.frame funciones juntas harán esto:

> 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, eso es nuevo para mí ... y eso es raro. – John

Cuestiones relacionadas