## Counting the number of elements with the values of x in a vector

### Question

I have a vector of numbers:

``````numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
453,435,324,34,456,56,567,65,34,435)
``````

How can I have R count the number of times a value x appears in the vector?

2016/10/04
1
412
10/4/2016 11:29:19 AM

You can just use `table()`:

``````> a <- table(numbers)
> a
numbers
4   5  23  34  43  54  56  65  67 324 435 453 456 567 657
2   1   2   2   1   1   2   1   2   1   3   1   1   1   1
``````

Then you can subset it:

``````> a[names(a)==435]
435
3
``````

Or convert it into a data.frame if you're more comfortable working with that:

``````> as.data.frame(table(numbers))
numbers Freq
1        4    2
2        5    1
3       23    2
4       34    2
...
``````
2009/12/17
516
12/17/2009 5:32:19 PM

I would probably do something like this

``````length(which(numbers==x))
``````

But really, a better way is

``````table(numbers)
``````
2009/12/17

There is also `count(numbers)` from `plyr` package. Much more convenient than `table` in my opinion.

2016/08/24

My preferred solution uses `rle`, which will return a value (the label, `x` in your example) and a length, which represents how many times that value appeared in sequence.

By combining `rle` with `sort`, you have an extremely fast way to count the number of times any value appeared. This can be helpful with more complex problems.

Example:

``````> numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
> a <- rle(sort(numbers))
> a
Run Length Encoding
lengths: int [1:15] 2 1 2 2 1 1 2 1 2 1 ...
values : num [1:15] 4 5 23 34 43 54 56 65 67 324 ...
``````

If the value you want doesn't show up, or you need to store that value for later, make `a` a `data.frame`.

``````> b <- data.frame(number=a\$values, n=a\$lengths)
> b
values n
1       4 2
2       5 1
3      23 2
4      34 2
5      43 1
6      54 1
7      56 2
8      65 1
9      67 2
10    324 1
11    435 3
12    453 1
13    456 1
14    567 1
15    657 1
``````

I find it is rare that I want to know the frequency of one value and not all of the values, and rle seems to be the quickest way to get count and store them all.

2012/12/13

There is a standard function in R for that

`tabulate(numbers)`

2012/04/19

``````numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435 453,435,324,34,456,56,567,65,34,435)

> length(grep(435, numbers))
 3

> length(which(435 == numbers))
 3

> require(plyr)
> df = count(numbers)
> df[df\$x == 435, ]
x freq
11 435    3

> sum(435 == numbers)
 3

> sum(grepl(435, numbers))
 3

> sum(435 == numbers)
 3

> tabulate(numbers)
 3

> table(numbers)['435']
435
3

> length(subset(numbers, numbers=='435'))
 3
``````
2017/06/07