2015-12-31 2 views
1

В вектор в R, если у меня есть данные любит:Хороший способ найти большинство в векторе в R?

1 1 2 1 1 3 3 1 1

В этом случае 1 это большинство.

Конечно, я могу перебирать список и подсчитывать вручную, но есть ли лучший способ в R найти то, что является основным значением в векторе?

+1

Возможный дубликат: http://stackoverflow.com/q/2547402/903061 – Gregor

ответ

6

Вы можете использовать table

x <- c(1,1,2,1,1,3,3,1,1) 
which.max(table(x)) 
# 1 
# 1 

Может быть, что-то вроде этого было бы более полезным.

names(which.max(table(x))) 
# "1" 

Другой вариант заключается в использовании count функции из plyr пакета

library(plyr) 
df <- count(x) 
df[which.max(df$freq),1] 
# [1] 1 
+1

Собирался спросить о графе ... –

+0

Не думаю, что ваше решение с 'x [who.max (table (x))] работает. Попробуйте 'x <- c (5,5,2,5,5,3,3,5,5)'. – RHertel

+1

@ RHertel Право. как насчет использования 'names'? См. Обновление. –

1

Мы могли бы ускорить функцию table с помощью Rcpp

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
std::map<double, int> tableC(NumericVector x) { 
std::map<double, int> counts; 
int n = x.size(); 
for (int i = 0; i < n; i++) { 
    counts[x[i]]++; 
    } 

return counts; 
} 

Затем мы source файл,

library(Rcpp) 
sourceCpp('Table.cpp') 
x <- c(1,1,2,1,1,3,3,1,1) 
tableC(x) 
#1 2 3 
#6 1 2 
which.max(tableC(x)) 
#1 
#1 
2

Мы могли бы попробовать

as.numeric(names(which.max(table(x)))) 

Пример:

x <- c(5,5,2,5,5,3,3,5,5) 
#> as.numeric(names(which.max(table(x)))) 
#[1] 5 

Объяснение:

Результат which.max(table(x)) является именованным числом, которое в данном случае является

#> which.max(table(x)) 
#5 
#3 

Здесь значение равно 3, а имя «5». Этот вывод предоставляет информацию о том, что наиболее частым входом является третье уникальное число, содержащееся в векторе, подсчитывается в порядке возрастания (здесь упорядоченные числа: 2, 3 и 5) и имеет «имя» 5. В случае вектора, состоящего из чисел, это обозначение номера может выглядеть странно, но вектор также может содержать слова, такие как «красный», «синий», «зеленый», а затем знание наименования наиболее частого слова определенно было бы полезно.

Нас интересует только имя, которое мы можем извлечь с помощью функции names(). Результатом является символ, который в нашем случае может быть принудительно введен в целое число с использованием as.numeric().

Смежные вопросы