Trouver les éléments les plus communs dans un vecteur dans R [duplicate]

Cette question a déjà une réponse ici:

J'ai un vecteur dire

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

Comment puis-je trouver les comptes de chaque élément et retourner les 3 éléments les plus fréquents, c'est-à-dire 1, 7, 5?

Je pense que cela devrait être très simple, mais j'ai des problèmes avec cela.

32
r
demandé sur gagolews 2013-06-29 02:35:54

4 réponses

Je suis sûr que c'est un doublon, mais la réponse est simple:

sort(table(variable),decreasing=TRUE)[1:3]
61
répondu Thomas 2013-06-28 22:38:10

Je ne sais pas si c'est mieux que l'approche de la table, mais si votre liste est déjà un facteur, sa méthode de résumé vous donnera des comptes de fréquence:

> 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 

Et puis vous pouvez obtenir le top 3 le plus fréquent comme ceci:

> 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"
9
répondu qwwqwwq 2013-06-28 22:47:46

Si votre vecteur ne contient que des entiers, tabulatesera beaucoup plus rapide que toute autre chose. Il y a quelques prises à prendre en compte:

  • il retournera par défaut le nombre pour les nombres de 1 à N.
  • il retournera un vecteur sans nom.

Cela signifie que si votre x = c(1,1,1,3) alors {[4] } retournera (3, 0, 1). Notez que les comptes sont pour 1 to max(x) par défaut.

Comment Pouvez-vous utiliser tabulate pour vous assurer que vous pouvez passer tout les chiffres?

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

Ajoutez simplement abs(min(x))+1 quand min(x) <= 0 pour vous assurer que les valeurs commencent à partir de 1. Si min(x) > 0, utilisez simplement tabulate directement.

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

Si votre vecteur contient NA, alors vous pouvez utiliser table avec useNA="always" paramètre.

8
répondu Arun 2013-06-28 22:56:58

Vous pouvez utiliser la fonction table() pour obtenir une tabulation de la fréquence des valeurs dans un tableau / vecteur, puis trier cette table.

x = c(1, 1, 1, 2, 2)
sort(table(x))
2 1
2 3
2
répondu cobie 2013-06-28 22:48:07