У меня есть вектор
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]
Я не знаю, насколько это лучше, чем подход к таблице, но если ваш список уже является фактором, то его итоговый метод даст вам частоту:
> 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
И тогда вы можете получить 3 наиболее часто встречающихся типа:
> 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)
. Обратите внимание, что по умолчанию значения count для 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