У меня есть вектор чисел:
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 появляется в векторе?
Вы можете просто использовать 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
...
a["435"]
взаменa[names(a)==435]
?Самый прямой путь
sum(numbers == x)
.numbers == x
создает логический вектор, который имеет значение ИСТИНА в каждом месте, где происходит x, и приsum
этом логический вектор приводится к числовому значению, которое преобразует ИСТИНА в 1 и ЛОЖЬ в 0.Тем не менее, обратите внимание , что для чисел с плавающей точкой, лучше использовать что - то вроде:
sum(abs(numbers - x) < 1e-6)
.источник
x
в данных, а не конкретное известное значениеx
. Чтобы быть справедливым, это было то, о чем был первоначальный вопрос. Как я сказал в своем ответе ниже: «Я нахожу, что редко я хочу знать частоту одного значения, а не всех значений ...»Я бы наверное сделал что то подобное
Но на самом деле, лучший способ
источник
table(numbers)
собирается сделать гораздо больше работы, чем простейшее решение,sum(numbers==x)
потому что он также рассчитает количество всех других чисел в списке.Есть также
count(numbers)
изplyr
пакета. Гораздо удобнее, чемtable
на мой взгляд.источник
Мое предпочтительное решение использует
rle
, которое будет возвращать значение (метка,x
в вашем примере) и длину, которая представляет, сколько раз это значение появилось в последовательности.Комбинируя
rle
сsort
, вы получаете очень быстрый способ подсчитать, сколько раз появилось любое значение. Это может быть полезно при более сложных проблемах.Пример:
Если нужное значение не отображается или вам нужно сохранить это значение для дальнейшего использования, сделайте
a
adata.frame
.Я нахожу, что редко я хочу знать частоту одного значения, а не всех значений, и кажется, что rle - это самый быстрый способ подсчитать и сохранить их все.
источник
c(rep('A', 3), rep('G', 4), 'A', rep('G', 2), rep('C', 10))
вернетсяvalues = c('A','G','A','G','C')
иlengths=c(3, 4, 1, 2, 10)
что иногда полезно.table
получается, что он быстрееwhen the vector is long
(я пробовал 100000), но немного дольше, когда он короче (я пробовал 1000)Для этого есть стандартная функция в R
tabulate(numbers)
источник
tabulate
является то, что вы не можете иметь дело с нулевыми и отрицательными числами.tabulate
. Примечание:sort
представляется необходимым для его правильного применения в целом:tabulate(sort(numbers))
.источник
вот один быстрый и грязный способ:
источник
Если вы хотите посчитать количество появлений впоследствии, вы можете использовать
sapply
функцию:Вывод:
источник
Вы можете изменить номер на любое другое в следующей строке
источник
Еще один способ, который я считаю удобным:
Это преобразует набор данных в фактор, а затем summary () дает нам контрольные суммы (количество уникальных значений).
Выход:
Это может быть сохранено как датафрейм при желании.
здесь row.names был использован для переименования имен строк. без использования row.names имена столбцов в s используются как имена строк в новом фрейме данных
Выход:
источник
Используя таблицу, но не сравнивая с
names
:table
полезно, когда вы используете количество различных элементов несколько раз. Если вам нужен только один счет, используйтеsum(numbers == x)
источник
Существуют разные способы подсчета конкретных элементов
источник
Метод, который является относительно быстрым для длинных векторов и дает удобный вывод, заключается в использовании
lengths(split(numbers, numbers))
(обратите внимание на S в концеlengths
):Выход просто именованный вектор.
Скорость кажется сравнимой с
rle
предложенной JBecker и даже немного выше на очень длинных векторах. Вот микробенчмарк в R 3.6.2 с некоторыми из предложенных функций:Важно отметить, что единственной функцией, которая также подсчитывает количество пропущенных значений,
NA
являетсяplyr::count
. Их также можно получить отдельно, используяsum(is.na(vec))
источник
Это очень быстрое решение для одномерных атомных векторов. Опирается на
match()
, поэтому он совместим сNA
:Вы также можете настроить алгоритм так, чтобы он не работал
unique()
.В тех случаях, когда этот вывод желателен, вам, вероятно, даже не нужно возвращать исходный вектор, а второй столбец, вероятно, - все, что вам нужно. Вы можете получить это в одну строку с трубкой:
источник
Это можно сделать,
outer
чтобы получить метрику равенствrowSums
с очевидным значением.Чтобы иметь счетчики и
numbers
в одном наборе данных, сначала создается data.frame. Этот шаг не нужен, если вы хотите раздельный ввод и вывод.источник