2012-04-19 8 views
8

उम्मीद है कि यहां एक साधारण उत्तर है लेकिन मुझे इसे कहीं भी नहीं मिला है।किसी डेटाटेबल (या डेटा.फ्रेम) में एक संख्यात्मक मैट्रिक्स को परिवर्तित करना

मैं लेबल पंक्तियों और स्तंभों के साथ एक अंकीय मैट्रिक्स है:

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

मैं प्रपत्र की एक data.table (या एक data.frame मैं तो परिवर्तित कर सकते हैं) चाहते हैं:

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

किसी भी सुझाव की सराहना की। reshape2 से

+3

भविष्य खोजकर्ताओं: यहां विपरीत देखें: http://stackoverflow.com/q/9617348 – Aaron

उत्तर

10

उपयोग melt:

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

मान लिया जाये कि 'एम' अपने मैट्रिक्स है ...

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

यह एक बड़े मैट्रिक्स पर बहुत तेज कार्यान्वित और भी आप के बारे में कैसे एक एक सा पता चलता मैट्रिक्स बनाया जाता है, इसमें चीजों का उपयोग कैसे किया जाता है, और अपने स्वयं के वैक्टर कैसे बनाएं।

+1

यह काफी रोचक है, धन्यवाद। पोस्ट किए गए सभी तीन समाधान 1k x 1k मैट्रिक्स के लिए मेरी मशीन पर 2% के भीतर हैं। – Chase

15

as.table और as.data.frame कार्यों को एक साथ यह कर देगा:

> 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

ठीक +1, यह मेरे लिए एक नया है ... और यह बहुत ही दुर्लभ है। – John

संबंधित मुद्दे