How to check if a vector contains a given value?
77 Answers
Both the match() (returns the first appearance) and %in% (returns a Boolean) functions are designed for this.
v <- c('a','b','c','e') 'b' %in% v ## returns TRUE match('b',v) ## returns the first location of 'b', in this case: 2 4is.element() makes for more readable code, and is identical to %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 4I will group the options based on output. Assume the following vector for all the examples.
v <- c('z', 'a','b','a','e') For checking presence:
%in%
> 'a' %in% v [1] TRUE any()
> any('a'==v) [1] TRUE is.element()
> is.element('a', v) [1] TRUE For finding first occurance:
match()
> match('a', v) [1] 2 For finding all occurances as vector of indices:
which()
> which('a' == v) [1] 2 4 For finding all occurances as logical vector:
==
> 'a' == v [1] FALSE TRUE FALSE TRUE FALSE Edit: Removing grep() and grepl() from the list for reason mentioned in comments
1The any() function makes for readable code
> 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 2You can use the %in% operator:
vec <- c(1, 2, 3, 4, 5) 1 %in% vec # true 10 %in% vec # false Also to find the position of the element "which" can be used as
pop <- c(3, 4, 5, 7, 13) which(pop==13) and to find the elements which are not contained in the target vector, one may do this:
pop <- c(1, 2, 4, 6, 10) Tset <- c(2, 10, 7) # Target set pop[which(!(pop%in%Tset))] 2I really like grep() and grepl() for this purpose.
grep() returns a vector of integers, which indicate where matches are.
yo <- c("a", "a", "b", "b", "c", "c") grep("b", yo) [1] 3 4 grepl() returns a logical vector, with "TRUE" at the location of matches.
yo <- c("a", "a", "b", "b", "c", "c") grepl("b", yo) [1] FALSE FALSE TRUE TRUE FALSE FALSE These functions are case-sensitive.
3