Подтвердить что ты не робот

Поиск наиболее общих элементов в векторе в R

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

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

Как найти счетчики каждого элемента и вернуть 3 наиболее часто встречающихся элемента, т.е. 1, 7, 5?

Я думаю, что это должно быть очень просто, но у меня возникают проблемы с этим.

4b9b3361

Ответ 1

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

sort(table(variable),decreasing=TRUE)[1:3]

Ответ 2

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

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

Ответ 3

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

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

Это означает, что если ваш 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".

Ответ 4

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

x = c(1, 1, 1, 2, 2)
sort(table(x))
2 1
2 3