क्या एक वेक्टर में एक तत्व के सूचकांक को खोजने के लिए एक आर फ़ंक्शन है?


324

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

बोनस अंक के लिए, क्या एक फ़ंक्शन है जो काम करता है अगर xएक वेक्टर है? है यही कारण है, इसके बारे में प्रत्येक तत्व की स्थिति को दर्शाता है सूचकांकों का एक वेक्टर लौटना चाहिए xमें v


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

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

जवाबों:


461

समारोह 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केवल एक मैच की पहली मुठभेड़ देता है, जैसा आपने अनुरोध किया था। यह पहले तर्क में मूल्यों के दूसरे तर्क में स्थिति लौटाता है।

कई मिलान के लिए, %in%जाने का तरीका है:

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अन्यथा।


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

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

1
मुझे लगता है कि यह तनावपूर्ण होगा कि matchयदि आप पहली घटना का सूचकांक चाहते हैं तो मामलों में तर्कों का क्रम । आपके उदाहरण के लिए, match(x,c(4,8))अलग-अलग परिणाम देता है, जो पहली बार में स्पष्ट नहीं है।
एपीसिट

@goldenoslik यदि आप के मदद पृष्ठ को पढ़ते हैं तो यह मदद करता है match। यह सब वहाँ समझाया गया है। लेकिन मैंने जानकारी के उस टुकड़े को जोड़ दिया।
जोरिस मेय्स

धन्यवाद! इस समाधान से मेरा दिन बच गया!
जिंहुआ वांग

26

Positionfunprog {base} में कार्य भी कार्य करता है। यह आपको एक मनमाना कार्य करने की अनुमति देता है, और पहला या अंतिम मैच लौटाता है।

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


10

उपरोक्त विधियों की दक्षता के बारे में एक छोटा सा नोट:

 library(microbenchmark)

  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which(month.abb %in% "Feb"))

  Unit: nanoseconds
   min     lq    mean median     uq  max neval
   891  979.0 1098.00   1031 1135.5 3693   100
   1052 1175.5 1339.74   1235 1390.0 7399  100

तो, सबसे अच्छा एक है

    which("Feb" == month.abb)[[1]]

आपका बेंचमार्क लंबाई 12 वेक्टर पर आधारित है और इसलिए सार्थक नहीं है। इसके अलावा अपने उदाहरण में which("Feb" == month.abb)रिटर्न 2-क्यों [[1]]?
अंकन

@markus यह कोड जो ("फ़रवरी" == महीना.बब) [[1]] "2" लौटाता है, और यह कोड जो (महीना "%"% "फ़रवरी") भी "2" देता है। इसके अलावा, यह स्पष्ट नहीं है कि वेक्टर का उपयोग करना क्यों सार्थक नहीं है
एंड्री

1
यह वेक्टर के बारे में नहीं है, बल्कि इसकी लंबाई के बारे में है। आपको उचित लंबाई का एक वेक्टर उत्पन्न करना चाहिए और फिर उसी के आधार पर एक बेंचमार्क करना चाहिए। ऑप्स सवाल से हवाला देते हुए "मुझे पता है कि एक तरह से यह करने के लिए है: which(x == v)[[1]] , । लेकिन यह है कि जरूरत से ज्यादा अकुशल लगता है"
अंक

-5

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

उदाहरण:

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

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


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

"यह काम करता है अगर दोनों वैक्टर हैं" - हो सकता है, आप जो मतलब रखते हैं उसके आधार पर ... लेकिन उस अर्थ में नहीं जो ओपी चाहता था।
फ्रैंक

30
मुझे FALSE FALSE TRUE FALSE TRUEइस उदाहरण में सूचकांकों के बजाय मिलता है
शशको लियखेंको

6
आपने इसे कभी आर में नहीं चलाया। ==लॉजिकल वेक्टर को लौटाता है, सूचकांकों को नहीं। इसके लिए आपको जरूरत है which(), जैसा कि मैंने 7 साल पहले समझाया था।
जोरिस मेव्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.