यदि वेक्टर में एक दिया गया तत्व है तो परीक्षण करें


518

कैसे जांचा जाए कि किसी वेक्टर में दिए गए मान हैं या नहीं?


38
कभी-कभी मैं अपने आप से पूछता हूं कि आर
यू

12
इस बात पर विचार करें कि "इन" "कॉन (इन) एस" में निहित है; मैं चाहता हूं कि "इन" इस संदर्भ में एक बहुत ही संक्षिप्त दावेदार है
हेडगैंडलेवरेड

1
शायद %फ़्लैंकिंग -signs के अलावा के साथ है। यह शब्द inआर-फॉर लूप कंस्ट्रक्शन में एक आरक्षित शब्द है।
IRTFM

@ greg121 dplyr में पहले से ही एक फ़ंक्शन शामिल है, लेकिन इसका उपयोग एक अलग उद्देश्य के लिए किया जाता है: डेटा फ्रेम में एक कॉलम का चयन करने के लिए। उदाहरण के लिए select(iris, contains("etal"))
पॉल रूजियक्स

क्या किसी दिए गए सटीक के साथ वास्तविक मूल्यवान संख्याओं के लिए ऐसा करने का एक संक्षिप्त तरीका है?
mlt

जवाबों:


500

दोनों match()(पहली उपस्थिति लौटाता है) और %in%(एक बूलियन देता है) फ़ंक्शन इसके लिए डिज़ाइन किए गए हैं।

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2

क्या सभी दिखावे के बारे में, न केवल पहले एक?
स्टैटसॉरसिएस

शायद मुझे थोड़ी देर हो जाए। which(v, 'b')। तर्कों के क्रम का ध्यान रखें।
निकलस मर्कट

तुम्हारी which(v, 'b') मुझे एक त्रुटि संदेश देता है:> त्रुटि जिसमें (v, 'b'): तर्क 'जो' तार्किक नहीं है
Capt.Krusty

176

is.element() अधिक पठनीय कोड के लिए बनाता है, और इसके समान है %in%

v <- c('a','b','c','e')

is.element('b', v)
'b' %in% v
## both return TRUE

is.element('f', v)
'f' %in% v
## both return FALSE

subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE

6
मुझे पता है कि दस्तावेज़ कहता है is.element(x, y) is identical to x %in% y। लेकिन, मुझे नहीं पता क्यों, is.elementsकाम करता है जब पूर्णांकों और numerics मिश्रण और %in%नहीं है
pomber

@pomber: क्या आप इसका एक उदाहरण दे सकते हैं?
शिष्य

@ पॉम्बर तय हो गया?
vasili111

2
बेहतर पठनीयता is.element()बनाम %in%व्यक्तिपरक है। एक मामला बनाया जा सकता है कि एक इन्फिक्स ऑपरेटर अधिक पठनीय है क्योंकि यह तर्कों के क्रम में अस्पष्टता को समाप्त करता है। apple in fruitसमझ में आता है, fruit in appleनहीं। is.element(apple, fruit)या फ़ंक्शन के is.element(fruit, apple)कार्यान्वयन के आधार पर दोनों सही हो सकते हैं is.element
rileymcdowell

70

मैं आउटपुट के आधार पर विकल्पों को समूहित करूंगा। सभी उदाहरणों के लिए निम्न वेक्टर मान लें।

v <- c('z', 'a','b','a','e')

उपस्थिति की जाँच के लिए:

% में%

> 'a' %in% v
[1] TRUE

कोई भी()

> any('a'==v)
[1] TRUE

is.element ()

> is.element('a', v)
[1] TRUE

पहली बार खोजने के लिए:

से मेल ()

> match('a', v)
[1] 2

सूचकांकों के वेक्टर के रूप में सभी घटनाओं को खोजने के लिए:

कौन कौन से()

> which('a' == v)
[1] 2 4

तार्किक वेक्टर के रूप में सभी घटनाओं को खोजने के लिए :

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

संपादित करें: टिप्पणियों में वर्णित कारण के लिए सूची से grep () और grepl () हटाना


6
जैसा कि पहले से ही यहां और यहां टिप्पणी की गई है , grep()सटीक मैच खोजने के लिए या नियमित अभिव्यक्ति का उपयोग न करें ।
उवे

69

किसी भी () पठनीय कोड के लिए समारोह बनाता है

> w <- c(1,2,3)
> any(w==1)
[1] TRUE

> v <- c('a','b','c')
> any(v=='b')
[1] TRUE

> any(v=='f')
[1] FALSE

9
ध्यान रखें कि यह अलग तरीके से व्यवहार करता है %in%: any(1==NA)रिटर्न NA, जहां 1 %in% NAरिटर्न FALSE

@ user3603486: any(1==NA, na.rm=TRUE)रिटर्न FALSE
20

36

आप %in%ऑपरेटर का उपयोग कर सकते हैं :

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

19

तत्व की स्थिति को खोजने के लिए "जो" का उपयोग किया जा सकता है

pop <- c(3,4,5,7,13)

which(pop==13)

और उन तत्वों को खोजने के लिए जो लक्ष्य वेक्टर में निहित नहीं हैं, एक ऐसा कर सकता है:

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]

whichवास्तव में बेहतर है कभी-कभी इसके लिए आपको इसके विपरीत सभी मिलान स्थिति (एक सरणी के रूप में) मिलती है match। हालांकि इस शायद नहीं था क्या ओ पी के लिए, के विपरीत पूछा stackoverflow.com/questions/1169388/...
सीटी

2
whichअगर आप तत्वों को नहीं ढूंढना चाहते हैं तो परेशान क्यों हों Tset? आप बस popसीधे सूचकांक कर सकते हैं; pop[!pop%in%Tset]
गृहलक्ष्मी

13

मैं वास्तव में इस उद्देश्य के लिए grep () और grepl () पसंद करता हूं।

grep () पूर्णांक का एक वेक्टर देता है, जो इंगित करता है कि मैच कहां हैं।

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4

grepl () मैचों के स्थान पर "TRUE" के साथ एक तार्किक वेक्टर देता है।

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

ये कार्य केस-संवेदी हैं।


10
डिफ़ॉल्ट रूप से, grepअपने पहले तत्व के रूप में एक नियमित अभिव्यक्ति लेता है, इसलिए "b"या तो उपयोग के लिए एक सटीक मिलान करना है^e$ या या जोड़ने के, fixed=TRUE )।
रीइनरईयरपोस्ट

10
सटीक मैचों के लिए रेगेक्स का उपयोग न करें। यह खतरनाक है और इसके अप्रत्याशित परिणाम हो सकते हैं
डेविड अर्नबर्ग १०'१६ को

9
हाँ, यह एक भयानक, कोई अच्छा, बहुत बुरा विचार नहीं है - अक्षम और तोड़ने की गारंटी है। जैसे myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)लौट आएगाTRUE , भले ही 'बी' में नहीं है myvar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.