2011-04-07 10 views
196

आर में, मेरे पास एक तत्व x और एक वेक्टर v है। मैं v में किसी तत्व की पहली अनुक्रमणिका खोजना चाहता हूं जो x के बराबर है। मुझे पता है कि ऐसा करने का एक तरीका यह है: which(x == v)[[1]], लेकिन यह अत्यधिक अक्षम लगता है। क्या ऐसा करने का कोई और सीधा तरीका है?क्या वेक्टर में किसी तत्व की अनुक्रमणिका ढूँढने के लिए कोई आर फ़ंक्शन है?

बोनस अंक के लिए, क्या कोई ऐसा कार्य है जो x एक वेक्टर है? यही है, इसे के प्रत्येक तत्व की स्थिति v में इंगित सूचकांक का एक वेक्टर वापस करना चाहिए। वैक्टर पर

+0

चूंकि आर को वैक्टर के साथ काम करने के लिए अनुकूलित किया गया है, 'कौन सा (x == v) [[1]]' इतना अक्षम नहीं है। यह एक तुलना ('==') ऑपरेटर सभी वेक्टर तत्वों पर लागू होता है और सूचकांक ('जो') पर एक सबसेटिंग लागू होता है। बस। कुछ भी नहीं जो प्रासंगिक होना चाहिए, जब तक आप इस समारोह पर 10.000 पुनरावृत्ति नहीं चल रहे हैं। 'मिलान' और 'स्थिति' जैसे अन्य समाधान' जो 'के रूप में कई डेटा वापस नहीं कर सकते हैं, लेकिन वे आवश्यक रूप से अधिक कुशल नहीं हैं। – BurninLeo

+1

मेरे प्रश्न ने निर्दिष्ट किया है कि मैं एक ऐसा फ़ंक्शन पसंद करूंगा जो एक्स पर सदिश हो गया था, और 'कौन सा (x == v) [[1]] 'नहीं है। –

उत्तर

279

समारोह match काम करता है:

x <- sample(1:10) 
x 
# [1] 4 5 9 3 8 1 6 10 7 2 
match(c(4,8),x) 
# [1] 1 5 

match केवल एक मैच की पहली मुठभेड़ देता है, के रूप में आप का अनुरोध किया। यह पहले तर्क में मूल्यों के दूसरे तर्क में स्थिति देता है।

x <- sample(1:4,10,replace=TRUE) 
x 
# [1] 3 4 3 3 2 3 1 1 2 2 
which(x %in% c(2,4)) 
# [1] 2 5 9 10 

%in% एक तार्किक वेक्टर एक TRUE साथ, पहले तर्क के रूप में रूप में लंबे समय वापस लौट आता है कि मूल्य दूसरा तर्क और एक FALSE में पाया जा सकता:

बहु मिलान के लिए, %in% जाने का रास्ता है अन्यथा।

+0

मुझे लगता है कि सी (2,3,3) और सी (1,2,3,4) दोनों के साथ एक उदाहरण और% में%% उदाहरणों के बीच कम परिवर्तन के साथ अधिक निर्देशक होगा। मैच (सी (2,3,3), सी (1: 4)) अलग-अलग परिणाम देता है जिसमें से (सी (2,3,3)%% c (1: 4) में) लंबे पहले वेक्टर की आवश्यकता के बिना और उदाहरण से उदाहरण के लिए कई बदलाव। यह ध्यान देने योग्य भी है कि वे गैर-मैचों को बहुत अलग तरीके से संभालते हैं। – John

+1

@ जॉन: यह सब सच है, लेकिन ओपी ने यही नहीं पूछा। ओपी ने एक लंबे वेक्टर से शुरू किया, दूसरे तत्वों में दिए गए तत्वों का पहला मैच ढूंढने के लिए कहा। और पूर्णता के लिए, मैंने कहा कि यदि आप सभी सूचकांक में रूचि रखते हैं, तो आपको इसका उपयोग करना होगा (% में%)। बीटीडब्ल्यू, आपके उत्तर को हटाने का कोई कारण नहीं है। यह वैध जानकारी है। –

+0

यह वैध जानकारी है लेकिन यह चला गया है ...:) – John

19

फ़ंक्शन Position फ़ंक्शनप्रोग {बेस} में कार्य भी करता है। यह आपको मनमाने ढंग से कार्य करने की अनुमति देता है, और पहला या अंतिम मैच देता है।

Position(f, x, right = FALSE, nomatch = NA_integer)

3

आर डबल बराबर एक वेक्टर भूसे के ढेर में सुई के सूचकांक को खोजने का एक विधि के साथ == ऑपरेटर अतिभारित किया है। यह logical वेक्टर उत्पन्न करता है, जिसमें घास के मैदान में प्रत्येक मैच के लिए TRUE मान होते हैं।

उदाहरण:

haystack <- c(1, 2, 4, 3, 4) 
needle <- 4 
indices <- needle == haystack 
indices 
[1] 3 5 
haystack[indices] 
[1] 4 4 

यह काम करता है अगर दोनों वैक्टर हैं, और साथ ही साथ कई वैक्टर का उपयोग करने के लिए विस्तारित किया जा सकता है।

+1

'==' ऑपरेटर पहले से ही मेरे प्रश्न में एक अक्षम समाधान के रूप में उल्लेख किया गया था जो सुइयों के वेक्टर के साथ काम नहीं करता है। –

+0

"यह दोनों काम करता है यदि वे वैक्टर हैं" - शायद, आपके मतलब के आधार पर ... लेकिन इस अर्थ में नहीं कि ओपी चाहता था। – Frank

+10

मुझे इस उदाहरण में सूचकांक के बजाय 'गलत झूठा वास्तविक गलत सत्य' मिलता है –

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