2014-04-03 6 views
6

मैं इस तरह एक चरित्र वेक्टर है साथ:केवल पहला वर्ण छंटाई, एक विशेष क्रम

stuff <- c("3S", "AH", "2I", "B4", "AL") 

और मैं इस तरह एक "स्थिति" वेक्टर है:

pos <- c("3", "B", "A", "2") 

मैं उपयोग करना चाहते हैं प्रत्येक तत्व के पहले चरित्र पर केवल प्रथम को क्रमबद्ध करने के संदर्भ के रूप में अंतिम वेक्टर; मुझे दूसरे चरित्र की परवाह नहीं है। यही है, मैं लिखना चाहता हूं और specialsort(stuff, pos) जैसे फ़ंक्शन, और मेरा परिणाम c("3S", "B4", "AH", "AL", "2I") होना चाहिए।

यह मुझे पागल कर रहा है। : -/

उत्तर

7

आप substring इस्तेमाल कर सकते हैं संदर्भ के खिलाफ अपने वेक्टर मैच के लिए stuff और match के पहले अक्षर को निकालने के लिए:

# find index in pos 
i <- match(substring(stuff, 1, 1), pos) 

# order by pos 
o <- order(i) 

stuff[o] 
# [1] "3S" "B4" "AH" "AL" "2I" 
+1

यह एक एक लाइनर के रूप में अश्लील नहीं है: 'सामान [आदेश (मैच (substr (सामान, 1 , 1), pos))] – thelatemail

+0

मैं वास्तव में उन दो समकक्ष समाधानों से प्यार करता था। दो लाइनर मेरे जैसे आर के लिए एक नवागंतुक के लिए बहुत ही निर्देशक है। समकक्ष oneliner सुंदर है। :) – Celso

0

आप एक चतुर के साथ यह कर सकते हैं (यदि मैं अपने आप को कह सकते हैं) में गड़बड़ी factors के स्थानांतरण शामिल:

stuff[order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos))] 

कुछ स्पष्टीकरण जोड़ सकते हैं और आसान बनाने के लिए संपादित:

012,

पहला भाग केवल आपके सामान वेक्टर के पहले अक्षर को अलग करना होगा। इस के साथ किया जा सकता है:

> sapply(stuff,function(x)unlist(strsplit(x,''))[1]) 
3S AH 2I B4 AL 
"3" "A" "2" "B" "A" 

उसके बाद, आप कारकों को यह परिवर्तित कर सकते हैं, के स्तर के रूप में अपने वेक्टर pos का उपयोग कर:

> factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos) 
3S AH 2I B4 AL 
3 A 2 B A 
Levels: 3 B A 2 

अंत में, आप इन कारकों से सही क्रम प्राप्त कर सकते हैं:

> order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos)) 
[1] 1 4 2 5 3 

खत्म बस अपने मूल stuff वेक्टर से एक सबसेट ले जा रहा है:

> stuff[order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos))] 
[1] "3S" "B4" "AH" "AL" "2I" 
2

मैं लगभग यकीन है कि वहाँ यह करने के लिए एक सरल तरीका है कर रहा हूँ, लेकिन यह काम करता है:

specialsort <- function(stuff, pos) { 
    stuff.pos <- sapply(pos,function(x) which(substring(stuff,1,1) == x)) 
    stuff[unlist(stuff.pos)] 
} 

specialsort(stuff,pos) 

सावधान हालांकि: यह (और कई अन्य समाधान) परोक्ष मानता है कि स्थिति वेक्टर अद्वितीय है।

0

कोशिश

stuff <- c("3S", "AH", "2I", "B4", "AL") 
pos <- c("3", "B", "A", "2") 

stuff.df = data.frame(stuff,pos = substr(stuff,1,1)) 
merge(data.frame(pos),stuff.df,sort = F) 

अनुसार क्रमबद्ध data.frame के "स्थिति" कॉलम आप क्या चाहते हैं

संबंधित मुद्दे