У меня есть вектор сказать
c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)
Как мне подсчитать каждый элемент, а затем вернуть, например, 3 самых распространенных элемента, то есть 1, 7, 5?
У меня есть вектор сказать
c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7)
Как мне подсчитать каждый элемент, а затем вернуть, например, 3 самых распространенных элемента, то есть 1, 7, 5?
Я уверен, что это дубликат, но ответ прост:
sort(table(variable),decreasing=TRUE)[1:3]
table(variable, useNA = "ifany")
, если вы проверяете, является ли NA
наиболее частым значением. иначе NA
s выпадет!
- person alexpghayes; 24.05.2017
Я не знаю, лучше ли это, чем табличный подход, но если ваш список уже является фактором, то его сводный метод даст вам подсчет частоты:
> 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"
Если ваш вектор содержит только целые числа, tabulate
будет намного быстрее, чем что-либо другое. Следует помнить о нескольких уловках:
Это означает, что если ваш 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"
.
вы можете использовать функцию table (), чтобы получить табуляцию частоты значений в массиве / векторе, а затем отсортировать эту таблицу.
x = c(1, 1, 1, 2, 2)
sort(table(x))
2 1
2 3