2012-08-22 11 views
20

में एक से अधिक स्तंभ के आधार पर मैट्रिक्स मैं एक मैट्रिक्सआदेश आर

df<-matrix(data=c(3,7,5,0,1,0,0,0,0,8,0,9), ncol=2) 
rownames(df)<-c("a","b","c","d","e","f") 

[,1] [,2] 
a 3 0 
b 7 0 
c 5 0 
d 0 8 
e 1 0 
f 0 9 

है और मैं पहले कॉलम 1 से और फिर स्तंभ दो मैट्रिक्स में जिसके परिणामस्वरूप द्वारा अवरोही क्रम में मैट्रिक्स ऑर्डर करने के लिए चाहते हैं

df.ordered<-matrix(data=c(7,5,3,1,0,0,0,0,0,0,9,8),ncol=2) 
rownames(df.ordered)<-c("b","c","a","e","f","d") 

    [,1] [,2] 
b 7 0 
c 5 0 
a 3 0 
e 1 0 
f 0 9 
d 0 8 

इस बारे में कोई सुझाव कि मैं इसे कैसे प्राप्त कर सकता हूं? धन्यवाद।

उत्तर

24

order फ़ंक्शन इसे करना चाहिए।

df[order(df[,1],df[,2],decreasing=TRUE),] 
+0

एक समाधान, के लिए जहां स्तंभों की संख्या मैं चाहता हूँ के लिए अच्छा नहीं होगा (एक आसानी से मैट्रिक्स के लिए अनुक्रमणिका का एक वेक्टर दे सकता है) के लिए क्रमबद्ध कर सकते हैं। – jmb

+1

@jmb: आपको अपने स्वयं के प्रश्न पूछना चाहिए, उदाहरण के साथ कि यह समाधान आपकी आवश्यकताओं के लिए पर्याप्त नहीं है। मैं एक त्वरित हैक के बारे में सोच सकता हूं, लेकिन अन्य शायद इससे बेहतर कुछ के साथ आ सकते हैं: 'df [do.call (ऑर्डर, सी (घटना = TRUE, data.frame (df [, 1: 2])), ] ' –

4

order समारोह तुम बाहर में मदद मिलेगी, इस प्रयास करें:

df[order(-df[,1],-df[,2]),] 
    [,1] [,2] 
b 7 0 
c 5 0 
a 3 0 
e 1 0 
f 0 9 
d 0 8 

शून्य से df से पहले इंगित करता है कि घटते क्रम है। आपको decreasing=TRUE पर एक ही परिणाम मिल जाएगा।

df[order(df[,1],df[,2],decreasing=TRUE),] 
13

हाथ से कॉलम निर्दिष्ट किए बिना ही मुख्य जवाब पूरा करने के लिए, यहाँ यह प्रोग्राम के रूप में करने के लिए एक रास्ता है,: एक साधारण उदाहरण के रूप

set.seed(2013) # preparing my example 
mat <- matrix(sample.int(10,size = 30, replace = T), ncol = 3) 
mat 
     [,1] [,2] [,3] 
[1,] 5 1 6 
[2,] 10 3 1 
[3,] 8 8 1 
[4,] 8 9 9 
[5,] 3 7 3 
[6,] 8 8 5 
[7,] 10 10 2 
[8,] 8 10 7 
[9,] 10 1 9 
[10,] 9 4 5 

, कहते हैं कि मैं सभी का उपयोग करना चाहते हैं उपस्थिति के अपने आदेश मैट्रिक्स की पंक्तियां सॉर्ट करने के लिए में कॉलम:

mat[do.call(order, as.data.frame(mat)),] #could be ..as.data.frame(mat[,index_vec]).. 
     [,1] [,2] [,3] 
[1,] 3 7 3 
[2,] 5 1 6 
[3,] 8 8 1 
[4,] 8 8 5 
[5,] 8 9 9 
[6,] 8 10 7 
[7,] 9 4 5 
[8,] 10 1 9 
[9,] 10 3 1 
[10,] 10 10 2