# Test if a vector contains a given element

573

How to check if a vector contains a given value?

sometimes I ask myself why R just doesn't use the word contains to make it users easiergreg121
consider that "in" is contained in "conta(in)s"; I'd contend that "in" is a considerably concise contender in this contexthedgedandlevered
Perhaps with the addition of flanking `%`-signs that is. The word `in` is a reserved word in R use in for-loop construction.IRTFM
@greg121 dplyr already has a contains function, but it's used for a different purpose: to select a column in a data frame. For example `select(iris, contains("etal"))`.Paul Rougieux
Is there a concise way to do it for real valued numbers with a given precision?mlt

545

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
``````
191

`is.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
``````
91

I 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

71

The 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
``````
37

You can use the `%in%` operator:

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

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))]
``````
13

I 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.