2012-06-19 7 views
5

पर आधारित एक मैट्रिक्स को सॉर्ट करें, मैं उसी आयाम के किसी अन्य मैट्रिक्स की पंक्तियों के समान क्रम में एक मैट्रिक्स की पंक्तियां लगाने की कोशिश कर रहा हूं। हालांकि मैं स्पष्ट रूप से यह नहीं समझ सकता कि स्पष्ट लूप के बिना इसे कैसे किया जाए। ऐसा लगता है कि मुझे इसे सबसेटिंग और लागू या मैप फ़ंक्शन के साथ करने में सक्षम होना चाहिए, लेकिन मैं यह नहीं समझ सकता कि इसे कैसे किया जाए।किसी अन्य मैट्रिक्स

यहाँ एक खिलौना उदाहरण है:

sortMe <- matrix(rnorm(6), ncol=2) 
sortBy <- matrix(c(2,1,3, 1,3,2), ncol=2) 

sorted <- sortMe 
for (i in 1:ncol(sortMe)) { 
    sorted[,i] <- sortMe[,i][sortBy[,i]] 
} 

इस विधि का उपयोग करना, जिसके परिणामस्वरूप sorted मैट्रिक्स sortMesortBy मैट्रिक्स के रूप में ही क्रम में सॉर्ट से मान हैं। कोई विचार है कि मैं लूप के बिना यह कैसे करूँगा?

उत्तर

8

यह (सूचकांक करने के लिए मैट्रिक्स के दो आयाम एक दो-स्तंभ पूर्णांक मैट्रिक्स का उपयोग करके) चाल करना चाहिए:

sorted <- sortMe 
sorted[] <- sortMe[cbind(as.vector(sortBy), as.vector(col(sortBy)))] 
3

lapply का उपयोग करना काम करेगा।

matrix(unlist(lapply(1:2, function(n) sortMe[,n][sortBy[,n]])), ncol=2) 

लेकिन वहाँ शायद एक अधिक कुशल तरीका है ...

3

मैं सुझाव दे रहा हूं कि आप अपना मूल संस्करण चिपके रहें। मैं तर्क दूंगा कि आपके द्वारा लिखे गए मूल लूप को प्रस्तावित अन्य समाधानों की तुलना में पढ़ने और समझने के लिए कुछ आसान (समझना आसान है)।

इसके अलावा, पाश अन्य समाधान के रूप में लगभग के रूप में तेजी से होता है: (मैं @Josh ओ ब्रायन के समय कोड उधार इससे पहले कि वह अपने पद से इसे हटा दिया।)

set.seed(444) 
n = 1e7 
sortMe <- matrix(rnorm(2 * n), ncol=2) 
sortBy <- matrix(c(sample(n), sample(n)), ncol=2) 

#--------------------------------------------------------------------------- 
# @JD Long, original post. 
system.time({ 
    sorted_JD <- sortMe 
    for (i in 1:ncol(sortMe)) { 
     sorted_JD[, i] <- sortMe[, i][sortBy[, i]] 
    } 
}) 
# user system elapsed 
# 1.190 0.165 1.334 

#--------------------------------------------------------------------------- 
# @Julius (post is now deleted). 
system.time({ 
    sorted_Jul2 <- sortMe 
    sorted_Jul2[] <- sortMe[as.vector(sortBy) + 
     rep(0:(ncol(sortMe) - 1) * nrow(sortMe), each = nrow(sortMe))] 
}) 
# user system elapsed 
# 1.023 0.218 1.226 

#--------------------------------------------------------------------------- 
# @Josh O'Brien 
system.time({ 
    sorted_Jos <- sortMe 
    sorted_Jos[] <- sortMe[cbind(as.vector(sortBy), as.vector(col(sortBy)))] 
}) 
# user system elapsed 
# 1.070 0.217 1.274 

#--------------------------------------------------------------------------- 
# @Justin 
system.time({ 
    sorted_Just = matrix(unlist(lapply(1:2, 
     function(n) sortMe[,n][sortBy[,n]])), ncol=2) 
}) 
# user system elapsed 
# 0.989 0.199 1.162 


all.equal(sorted_JD, sorted_Jul2) 
# [1] TRUE 
all.equal(sorted_JD, sorted_Jos) 
# [1] TRUE 
all.equal(sorted_JD, sorted_Just) 
# [1] TRUE 
+0

रूपरेखा के लिए धन्यवाद। यह वास्तव में दिलचस्प है! –