2013-10-17 5 views
6

द्वारा क्रमबद्ध करें क्या कोई जानता है कि पूर्ण मूल्य से आर में वेक्टर को सॉर्ट करना है, तो (-2, 3, 1) -> (1, -2, 3) आदि?पूर्ण मूल्य

अगर मैं इसे पायथन में कर रहा था तो मैं प्रत्येक मूल्य और उसके संकेत की एक जोड़ी तैयार करूंगा, पूर्ण मूल्य से जोड़ों की सूची को क्रमबद्ध करें, फिर साइन को दोबारा लागू करें, लेकिन मैं आर के लिए बहुत नया हूं इसलिए कोई विचार नहीं है यह कैसे करना है।

v[order(abs(v))] 

जहां v वेक्टर है क्रमबद्ध करना:

चीयर्स

+6

'एक्स [आदेश (पेट (x))]'? – Arun

+3

संयोग से, पायथन में जोड़ों को बनाने के बजाय 'x.sort (key = abs)' करना आसान होगा –

+0

बहुत बहुत धन्यवाद! –

उत्तर

8

@ अरुण की विधि टीआरटी है।

नोट्स:

  • यह v के रूप में एक ही आकार के एक नए वेक्टर abs(v) पैदा करता है। यह बहुत मेमोरी-कुशल नहीं है, लेकिन मुझे नहीं लगता कि इसे R, में टाला जा सकता है, उदाहरण के लिए, लिस्प: (sort #'< v :key #'abs) या पायथन: v.sort(key=abs)
  • यह अस्थायी वेक्टर आवंटन एक बुरी चीज नहीं है: आप स्मृति खो देते हैं, लेकिन आप समय जीतते हैं क्योंकि एक्सेसर कुंजी को केवल N बार कहा जाता है, N*log(N) बार नहीं, जो महत्वपूर्ण नहीं है जब कुंजी सस्ता नहीं है (abs के विपरीत या एक संरचना क्षेत्र)।
  • अधिक सटीक होने के लिए, वेक्टर abs(v) बहुत जल्द कचरा इकट्ठा किया जाता है, लेकिन इसके आवंटन (और, विशेष रूप से, garbage collection) बड़े वैक्टरों के लिए महंगा होते हैं और स्मृति मेहनत होने पर वास्तव में समस्याग्रस्त हो सकते हैं।

यह भी देखें:

+0

लेकिन वह वेक्टर क्षणिक है, है ना? सॉर्टिंग के लिए –

+0

@ करल? क्या यह भी संभव है? –

+0

@ कोनराड रुडॉल्फ मैंने गलत शब्द का उपयोग किया हो सकता है - क्या यह सच नहीं है कि वेक्टर 'abs (v)' मूल वातावरण में नहीं है और अगले कचरा संग्रह पर गायब हो जाएगा? तो यह चरम रैम को प्रभावित कर सकता है लेकिन स्थायी नहीं होगा। –

1

मैं इसे उपयोगी एक समारोह में इस पैकेज ताकि मैं इसे करने के लिए एक वेक्टर गुजारें सकता पाया, और यह भी कि order फ़ंक्शन जैसे अन्य विकल्पों का उपयोग करने का विकल्प था। यह अनिवार्य रूप से the existing answer पर आधारित है।

sort_abs <- function(x, na.last = TRUE, decreasing = FALSE) { 
    x[order(abs(x), na.last = na.last, decreasing = decreasing)] 
} 

उदाहरण के लिए,

> sort_abs(c(-1,NA,2,-2)) 
[1] -1 2 -2 NA 
> sort_abs(c(-1,NA,2,-2), decreasing = TRUE, na.last = FALSE) 
[1] NA 2 -2 -1 
संबंधित मुद्दे