Найдите n наиболее распространенных значений в векторе

У меня есть вектор сказать

c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)

Как мне подсчитать каждый элемент, а затем вернуть, например, 3 самых распространенных элемента, то есть 1, 7, 5?


person ChairmanMeow    schedule 28.06.2013    source источник
comment
вы можете использовать table () .. см. stackoverflow.com/questions/1923273/   -  person cobie    schedule 29.06.2013


Ответы (4)


Я уверен, что это дубликат, но ответ прост:

sort(table(variable),decreasing=TRUE)[1:3]
person Thomas    schedule 28.06.2013
comment
используйте table(variable, useNA = "ifany"), если вы проверяете, является ли NA наиболее частым значением. иначе NAs выпадет! - person alexpghayes; 24.05.2017
comment
@DavidT: это неверно - person Helen; 12.08.2020

Я не знаю, лучше ли это, чем табличный подход, но если ваш список уже является фактором, то его сводный метод даст вам подсчет частоты:

> summary(as.factor(c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)))
1 2 3 4 5 7 
6 1 1 1 2 5 

А затем вы можете попасть в тройку самых частых:

> names(sort(summary(as.factor(c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7))), decreasing=T)[1:3])
[1] "1" "7" "5"
person qwwqwwq    schedule 28.06.2013

Если ваш вектор содержит только целые числа, tabulate будет намного быстрее, чем что-либо другое. Следует помнить о нескольких уловках:

  • По умолчанию он возвращает количество чисел от 1 до N.
  • Он вернет безымянный вектор.

Это означает, что если ваш x = c(1,1,1,3), то tabulate(x) вернет (3, 0, 1). Обратите внимание, что по умолчанию подсчитывается 1 to max(x).

Как вы можете использовать tabulate, чтобы убедиться, что вы можете передавать любые числа?

set.seed(45)
x <- sample(-5:5, 25, TRUE)
#  [1]  1 -2 -3 -1 -2 -2 -3  1 -3 -5 -1  4 -2  0 -1 -1  5 -4 -1 -3 -4 -2  1  2  4

Просто добавьте abs(min(x))+1, когда min(x) <= 0, чтобы убедиться, что значения начинаются с 1. Если min(x) > 0, тогда просто используйте tabulate напрямую.

sort(setNames(tabulate(x + ifelse(min(x) <= 0, abs(min(x))+1, 0)), 
      seq(min(x), max(x))), decreasing=TRUE)[1:3]

Если ваш вектор действительно содержит NA, вы можете использовать table с параметром useNA="always".

person Arun    schedule 28.06.2013

вы можете использовать функцию table (), чтобы получить табуляцию частоты значений в массиве / векторе, а затем отсортировать эту таблицу.

x = c(1, 1, 1, 2, 2)
sort(table(x))
2 1
2 3
person cobie    schedule 28.06.2013