How to check if a vector contains a given value?

### 7 Answers

545

votes

191

votes

`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

votes

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

votes

37

votes

20

votes

13

votes

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.

`%`

-signs that is. The word`in`

is a reserved word in R use in for-loop construction. – IRTFM`select(iris, contains("etal"))`

. – Paul Rougieux