मान लीजिए मैंकैसे सभी स्तंभों द्वारा एक मैट्रिक्स सॉर्ट करने के लिए
arr = 2 1 3
1 2 3
1 1 2
मैं इस नीचे में सॉर्ट कर सकते हैं है?
arr = 1 1 2
1 2 3
2 1 3
यही है, पहले कॉलम एक के बाद, फिर स्तंभ दो आदि
मान लीजिए मैंकैसे सभी स्तंभों द्वारा एक मैट्रिक्स सॉर्ट करने के लिए
arr = 2 1 3
1 2 3
1 1 2
मैं इस नीचे में सॉर्ट कर सकते हैं है?
arr = 1 1 2
1 2 3
2 1 3
यही है, पहले कॉलम एक के बाद, फिर स्तंभ दो आदि
द्वारा यह काम करेगा:
arr[do.call(order, lapply(1:NCOL(arr), function(i) arr[, i])), ]
क्या यह कर रहा है:
arr[order(arr[, 1], arr[, 2], arr[ , 3]), ]
छोड़कर
यह मैट्रिक्स में स्तंभों की मनमानी संख्या की अनुमति देता है।
समारोह कर रहे है के बाद 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 कॉलम है, लेकिन यह केवल एक है।
+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,])
}
मैं एक ऐसी ही समस्या थी, और समाधान सरल और सुरुचिपूर्ण हो रहा है:
t(apply(t(yourMatrix),2,sort))
अंतिम कॉलम ऑर्डर अनावश्यक नहीं है? अर्थात। 1: (एनसीओएल (एआर) -1) वही करेगा। – mdsumner
नहीं, सभी मैट्रिक्स में नहीं, जैसे 'arr = matrix (c (1, 1, 1, 1, 1, 1, 3, 2, 1), nrow = 3) ' –
दोह, इसके लिए धन्यवाद धन्यवाद :) विवरण में समझाए गए समय बिताने के लिए – mdsumner