2012-04-19 44 views
8

Hy vọng có một câu trả lời đơn giản ở đây nhưng tôi không thể tìm thấy nó ở bất cứ đâu.Chuyển đổi ma trận số thành một data.table (hoặc data.frame)

Tôi có một ma trận số với hàng và cột được dán nhãn:

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

Tôi muốn một data.table (hoặc một data.frame sau đó tôi có thể chuyển đổi) có dạng:

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

Bất kỳ mẹo nào được đánh giá cao.

+3

người tìm kiếm tương lai: thấy điều ngược lại ở đây: http://stackoverflow.com/q/9617348 – Aaron

Trả lời

10

Sử dụng melt từ 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

Giả sử 'M' là ma trận của bạn ...

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

này thực hiện rất nhanh trên một ma trận lớn và cũng cho bạn một chút thông tin về làm thế nào một ma trận được tạo ra, cách truy cập mọi thứ trong đó, và cách xây dựng các vectơ của riêng bạn.

+1

Điều này khá thú vị, cảm ơn bạn. Tất cả ba giải pháp được đăng đều nằm trong phạm vi 2% trên máy tính của tôi cho ma trận 1k x 1k. – Chase

15

Các as.tableas.data.frame chức năng với nhau sẽ làm điều này:

> 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, đó là một cái mới đối với tôi ... và đó là loại hiếm. – John

Các vấn đề liên quan