2009-10-14 15 views
79

के मानों के आधार पर एक वेक्टर को कैसे क्रमबद्ध करूं, मेरे पास वेक्टर x है, जिसे मैं वेक्टर वाई में मानों के क्रम के आधार पर क्रमबद्ध करना चाहता हूं। दो वैक्टर एक ही लंबाई के नहीं हैं।मैं किसी अन्य

x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3) 
y <- c(4, 2, 1, 3) 

अपेक्षित परिणाम होगा: y से अधिक

[1] 4 4 4 2 2 1 3 3 3 

उत्तर

59

यहाँ एक एक लाइनर है ...

y[sort(order(y)[x])] 

[संपादित करें:] यह टूट जाती है इस प्रकार है:

order(y)    #We want to sort by y, so order() gives us the sorting order 
order(y)[x]   #looks up the sorting order for each x 
sort(order(y)[x]) #sorts by that order 
y[sort(order(y)[x])] #converts orders back to numbers from orders 
+0

यह बहुत संक्षिप्त है, लेकिन मुझे यह पता लगाना मुश्किल हो रहा है कि वहां क्या हो रहा है। क्या आप थोड़ा सा विस्तार कर सकते हैं? –

+0

धन्यवाद! ऑर्डर() मुझे परेशान कर रहा था - लग रहा था कि यह मनमाने ढंग से संख्याओं को पुन: व्यवस्थित कर रहा था, लेकिन यह केवल 1-4 का अनुक्रम होने का एक आर्टिफैक्ट था। –

+2

यह सुंदर है और आर के अंतर्निहित इंस की अच्छी समझ दिखाता है। +1 – Godeke

-3

पाश और स्थान को दूर करने के एक्स में मेल खाने वाले सभी मूल्य चलते हैं।

0
x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3) 
y <- c(4, 2, 1, 3) 
for(i in y) { z <- c(z, rep(i, sum(x==i))) } 

z में परिणाम: 4 4 4 2 2 1 3 3 3

महत्वपूर्ण कदम:

  1. (i y में)

    - ब्याज के तत्वों से अधिक लूप्स ।

  2. z < - सी (जेड, ...) - concatenates बदले में प्रत्येक उपसूचक

  3. प्रतिनिधि (मैं, योग (एक्स == i)) - पुनर्प्रसारण मैं (मौजूदा ब्याज के तत्व) योग (x == i) बार (हमने x में पाया समय की संख्या)।

3

आप एक आदेश दिया कारक में x परिवर्तित कर सकते हैं:

x.factor <- factor(x, levels = y, ordered=TRUE) 
sort(x) 
sort(x.factor) 

जाहिर है, कारकों को ध्यान में अपने नंबर बदल पूर्ण रूप से बदल सकते हैं जिस तरह से कोड नीचे की ओर x के प्रति प्रतिक्रिया करता। लेकिन चूंकि आपने हमें आगे क्या होता है इसके बारे में कोई संदर्भ नहीं दिया है, मैंने सोचा कि मैं इसे एक विकल्प के रूप में सुझाऊंगा।

+0

यह सबसे अच्छा जवाब होना चाहिए क्योंकि यह गैर पूर्णांक मामलों के लिए काम करेगा; या जब भी 'x' में मानते हैं तो सॉर्टिंग वेक्टर 'y' में मामूली परिवर्तन के साथ मान नहीं होते हैं:' x <- c (2, 2, 3, 4, 1, 4, 4, 3, 3, 6); वाई <- सी (4, 2, 1, 3); as.numeric (as.character (सॉर्ट (कारक (एक्स, अनन्य (सी (वाई, एक्स))))) ' – rawr

1

[ संपादित करें:। जाहिर इयान सही दृष्टिकोण है, लेकिन मैं भावी पीढ़ी के लिए इस में छोड़ देंगे]

आप अपने y वेक्टर पर अनुक्रमण द्वारा छोरों के बिना यह कर सकते हैं। y के लिए एक बढ़ाने संख्यात्मक मान जोड़ें और विलय उन्हें:

y <- data.frame(index=1:length(y), x=y) 
x <- data.frame(x=x) 
x <- merge(x,y) 
x <- x[order(x$index),"x"] 
x 
[1] 4 4 4 2 2 1 3 3 3 
2

कैसा रहेगा?:

rep(y,table(x)[as.character(y)]) 

(इयान के शायद अभी भी बेहतर है) आप "y" कोई बात नहीं पर आदेश प्राप्त करने की आवश्यकता

111

क्या यह एक

x[order(match(x,y))] 
+18

स्वीकार्य उत्तर IMHO से यह बहुत अच्छा है, क्योंकि यह अधिक सामान्य है। – fmark

+2

मैं कहूंगा कि यह आधार जीएनयू-आर में होना चाहिए। –

+0

यह वास्तव में मजाकिया है कि मैं इस स्थिति में कितनी बार आती हूं और इस पंक्ति के उत्तर में आवर्ती हो जाती हूं। यह दिखाने के लिए जाता है कि कम से कम जटिल चीजों पर कैसे मददगार हो सकता है –

0

मामले में के बारे में अगर यह की संख्या या अक्षर:

x[order(ordered(x, levels = y))] 
4 4 4 2 2 1 3 3 3 

तक कदम:

a <- ordered(x, levels = y) # Create ordered factor from "x" upon order in "y". 
[1] 2 2 3 4 1 4 4 3 3 
Levels: 4 < 2 < 1 < 3 

b <- order(a) # Define "x" order that match to order in "y". 
[1] 4 6 7 1 2 5 3 8 9 

x[b] # Reorder "x" according to order in "y". 
[1] 4 4 4 2 2 1 3 3 3 
संबंधित मुद्दे