Подсчет количества элементов со значениями x в векторе - PullRequest
361 голосов
/ 17 декабря 2009

У меня есть вектор чисел:

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

Как можно R посчитать, сколько раз значение x появляется в векторе?

Ответы [ 14 ]

454 голосов
/ 17 декабря 2009

Вы можете просто использовать 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 

Тогда вы можете установить его на подмножество:

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

Или преобразовать его в data.frame, если вам удобнее работать с этим:

> as.data.frame(table(numbers))
   numbers Freq
1        4    2
2        5    1
3       23    2
4       34    2
...
243 голосов
/ 17 декабря 2009

Самый прямой путь - sum(numbers == x).

numbers == x создает логический вектор, который имеет значение ИСТИНА в каждом месте, где происходит x, а при sum ing логический вектор приводится к числовому, который преобразует ИСТИНА в 1 и ЛОЖЬ в 0.

Однако учтите, что для чисел с плавающей точкой лучше использовать что-то вроде: sum(abs(numbers - x) < 1e-6).

51 голосов
/ 17 декабря 2009

Я бы, наверное, сделал что-то подобное

length(which(numbers==x))

Но на самом деле, лучший способ это

table(numbers)
37 голосов
/ 06 июня 2013

Существует также count(numbers) из plyr пакета. Гораздо удобнее, чем table на мой взгляд.

32 голосов
/ 14 декабря 2012

Мое предпочтительное решение использует rle, которое будет возвращать значение (метка, x в вашем примере) и длину, которая представляет, сколько раз это значение появилось в последовательности.

Комбинируя rle с sort, вы получаете чрезвычайно быстрый способ подсчета количества появлений любого значения. Это может быть полезно при более сложных проблемах.

Пример:

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

Если нужное вам значение не отображается или вам нужно сохранить это значение на потом, сделайте 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

Я нахожу, что редко я хочу знать частоту одного значения, а не все значения, и кажется, что rle - это самый быстрый способ подсчитать и сохранить их все.

17 голосов
/ 19 апреля 2012

Для этого есть стандартная функция в R

tabulate(numbers)

9 голосов
/ 07 июня 2017
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))
[1] 3


> length(which(435 == numbers))
[1] 3


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


> sum(435 == numbers)
[1] 3


> sum(grepl(435, numbers))
[1] 3


> sum(435 == numbers)
[1] 3


> tabulate(numbers)[435]
[1] 3


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


> length(subset(numbers, numbers=='435')) 
[1] 3
9 голосов
/ 17 декабря 2009

вот один быстрый и грязный способ:

x <- 23
length(subset(numbers, numbers==x))
8 голосов
/ 15 мая 2015

Если вы хотите посчитать количество появлений впоследствии, вы можете использовать функцию sapply:

index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)

Выход:

        numbers index
 [1,]       4     1
 [2,]      23     1
 [3,]       4     2
 [4,]      23     2
 [5,]       5     1
 [6,]      43     1
 [7,]      54     1
 [8,]      56     1
 [9,]     657     1
[10,]      67     1
[11,]      67     2
[12,]     435     1
[13,]     453     1
[14,]     435     2
[15,]     324     1
[16,]      34     1
[17,]     456     1
[18,]      56     2
[19,]     567     1
[20,]      65     1
[21,]      34     2
[22,]     435     3
7 голосов
/ 18 февраля 2016

Вы можете изменить номер на любое другое в следующей строке

length(which(numbers == 4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...