2012-05-09 13 views

उत्तर

16

द्वारा यह काम करेगा:

arr[do.call(order, lapply(1:NCOL(arr), function(i) arr[, i])), ] 

क्या यह कर रहा है:

arr[order(arr[, 1], arr[, 2], arr[ , 3]), ] 
छोड़कर

यह मैट्रिक्स में स्तंभों की मनमानी संख्या की अनुमति देता है।

+0

अंतिम कॉलम ऑर्डर अनावश्यक नहीं है? अर्थात। 1: (एनसीओएल (एआर) -1) वही करेगा। – mdsumner

+1

नहीं, सभी मैट्रिक्स में नहीं, जैसे 'arr = matrix (c (1, 1, 1, 1, 1, 1, 3, 2, 1), nrow = 3) ' –

+0

दोह, इसके लिए धन्यवाद धन्यवाद :) विवरण में समझाए गए समय बिताने के लिए – mdsumner

20

समारोह कर रहे है के बाद order (कैसे मैं इस निष्कर्ष पर पहुंचे - तो मेरा पहला विचार किया गया था "ठीक है,, छंटाई क्या sort के बारे में?" sort(arr) जो लग रहा है यह arr पंक्ति के बजाय एक वेक्टर के रूप में सॉर्ट करता तरह की कोशिश की। - ?sort पर देखकर, "यह भी देखें: orderएकाधिक चरों को क्रमबद्ध या पुन: क्रमबद्ध करने के लिए देखें।")।

?order को देखते हुए, मुझे लगता है कि order(x,y,z, ...), x द्वारा आदेश देगा, y से संबंधों को तोड़ने के z से आगे संबंधों को तोड़ने, और इतने पर। बढ़िया - मुझे ऐसा करने के लिए arr से order के प्रत्येक कॉलम में पास करना है।

order(arr[,1], arr[,2], arr[,3]) 
# gives 3 2 1: row 3 first, then row 2, then row 1. 
# Hence: 
arr[ order(arr[,1], arr[,2], arr[,3]), ] 
#  [,1] [,2] [,3] 
#[1,] 1 1 2 
#[2,] 1 2 3 
#[3,] 2 1 3 

महान: (वहाँ ?order का उदाहरण अनुभाग में इस के लिए भी एक उदाहरण है)!


लेकिन यह थोड़ा कष्टप्रद मैं के लिए arr[,i] को लिखने के लिए है कि है arr में प्रत्येक स्तंभ - अगर मैं नहीं जानता कि क्या कितने कॉलम यह पहले से है?

ठीक है, उदाहरण दिखाते हैं कि आप यह कैसे कर सकते हैं: do.call का उपयोग कर। असल में, तुम क्या:

do.call(order, args) 

जहां args एक order में तर्कों की सूची है। इसलिए यदि आप arr के प्रत्येक कॉलम से एक सूची बना सकते हैं तो आप इसे args के रूप में उपयोग कर सकते हैं।

एक तरीका यह है करने के लिए एक डेटा फ्रेम में और फिर एक सूची में arr कन्वर्ट करने के लिए है - यह स्वतः सूची के तत्व प्रति एक स्तंभ डाल देंगे:

arr[ do.call(order, as.list(as.data.frame(arr))), ] 

as.list(as.data.frame थोड़ा kludgy है - list[[i]]arr का 0 कॉलम है, लेकिन यह केवल एक है।

+0

+1! –

1

मैं इस छोटे से समारोह है कि घटते क्रम करता है और साथ ही कॉलम जो कॉलम ऑर्डर करने के लिए चयन करने के लिए अनुमति देता है और अपने आदेश में लिखा था

ord.mat = function(M, decr = F, cols = NULL){ 
    if(is.null(cols)) 
     cols = 1: ncol(M) 
    out = do.call("order", as.data.frame(M[,cols])) 
    if (decr) 
     out = rev(out) 
    return(M[out,]) 
} 
1

मैं एक ऐसी ही समस्या थी, और समाधान सरल और सुरुचिपूर्ण हो रहा है:

t(apply(t(yourMatrix),2,sort)) 
संबंधित मुद्दे