En R, mean()
et median()
sont des fonctions standards qui font ce que vous attendez. mode()
vous indique le mode de stockage interne de l'objet, pas la valeur qui apparaît le plus dans son argument. Mais existe-t-il une fonction de bibliothèque standard qui implémente le mode statistique pour un vecteur (ou une liste)?
r
statistics
r-faq
pseudo
la source
la source
mode
il la même chose que la fonctionclass
?Réponses:
Une solution de plus, qui fonctionne à la fois pour les données numériques et de caractères / facteurs:
Sur ma petite machine dinky, cela peut générer et trouver le mode d'un vecteur entier de 10M en environ une demi-seconde.
Si votre ensemble de données peut avoir plusieurs modes, la solution ci-dessus adopte la même approche que
which.max
et renvoie la première valeur apparente de l'ensemble de modes. Pour retourner tous les modes, utilisez cette variante (de @digEmAll dans les commentaires):la source
c(1,1,2,2)
). Vous devriez changer votre dernière ligne avec:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
ux[which.max(tabulate(match(x, ux)))]
par justemax(tabulate(match(x, ux)))
.Mode(1:3)
donne1
etMode(3:1)
donne3
, donc Mode renvoie l'élément le plus fréquent ou le premier si tous sont uniques.0
ouNA
dans ces cas.Il existe un ensemble
modeest
qui fournit des estimateurs du mode des données unimariées unimodales (et parfois multimodales) et des valeurs des modes des distributions de probabilité habituelles.Pour plus d'informations, voir cette page
la source
mfv(mySamples)[1]
. L'1
être important car il renvoie en fait la valeur la plus fréquente s .mfv(mySamples)
trouvé cela sur la liste de diffusion r, j'espère que c'est utile. C'est aussi ce que je pensais de toute façon. Vous voudrez déposer () les données, trier puis choisir le prénom. C'est hackish mais ça devrait marcher.
la source
J'ai trouvé que le post de Ken Williams ci-dessus était génial, j'ai ajouté quelques lignes pour tenir compte des valeurs NA et en ai fait une fonction pour plus de facilité.
la source
Une manière rapide et sale d'estimer le mode d'un vecteur de nombres que vous croyez provenir d'une distribution univariée continue (par exemple une distribution normale) consiste à définir et à utiliser la fonction suivante:
Ensuite, pour obtenir l'estimation du mode:
la source
set.seed(1); a<-runif(100); mode<-density(a)$x[which.max(density(a)$y)]; abline(v=mode)
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
density
. Cependant, si vous n'avez qu'un seul point de données, la valeur de ce point de données sera probablement votre meilleure estimation pour le mode de toute façon ...estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } }
je teste la méthode pour estimer le vent de direction prédominante, au lieu de la moyenne de la direction en utilisant la moyenne vectorielle avec un package circulaire. I ', en travaillant avec des points sur une pente polygonale, il y a donc parfois un seul point avec une direction. Merci!La fonction suivante se présente sous trois formes:
method = "mode" [default]: calcule le mode pour un vecteur unimodal, sinon renvoie une
méthode NA = "nmodes": calcule le nombre de modes dans le vecteur
method = "modes": répertorie tous les modes pour un unimodal ou polymodal vecteur
la source
method = 'modes'
. Ensuite, la fonction renvoie toutes les valeurs uniques, mais en réalité il n'y a pas de mode, elle devrait donc retourner à laNA
place. J'ajouterai une autre réponse contenant une version légèrement optimisée de votre fonction, merci pour l'inspiration!Ici, une autre solution:
la source
Je ne peux pas encore voter mais la réponse de Rasmus Bååth est ce que je cherchais. Cependant, je le modifierais un peu en permettant de limiter la distribution par exemple pour les valeurs uniquement entre 0 et 1.
Nous savons que vous ne voudrez peut-être pas du tout limiter votre distribution, puis définissez de = - "BIG NUMBER" à = "BIG NUMBER"
la source
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
Une petite modification à la réponse de Ken Williams, ajoutant des paramètres optionnels
na.rm
etreturn_multiple
.Contrairement aux réponses reposant sur
names()
, cette réponse conserve le type de données dex
dans la ou les valeurs renvoyées.Pour montrer qu'il fonctionne avec les paramètres facultatifs et maintient le type de données:
Merci à @Frank pour la simplification.
la source
J'ai écrit le code suivant afin de générer le mode.
Essayons:
la source
Basé sur la fonction de @ Chris pour calculer le mode ou les métriques associées, mais en utilisant la méthode de Ken Williams pour calculer les fréquences. Celui-ci fournit un correctif pour le cas d'aucun mode du tout (tous les éléments sont également fréquents), et quelques
method
noms plus lisibles .Puisqu'il utilise la méthode de Ken pour calculer les fréquences, les performances sont également optimisées, en utilisant le post d'AkselA, j'ai comparé certaines des réponses précédentes pour montrer comment ma fonction est proche de celle de Ken en termes de performances, les conditions pour les différentes options de sortie ne provoquant que des frais généraux mineurs:
la source
Mode
fonction trouvée dans lepracma
package. Soin d'expliquer?pracma
package faites-vous référence? La version 1.9.3 a une implémentation complètement différente pour autant que je puisse voir.Ce hack devrait fonctionner correctement. Vous donne la valeur ainsi que le nombre de modes:
la source
R a tellement de modules complémentaires que certains d'entre eux peuvent très bien fournir le mode [statistique] d'une liste / série / vecteur numérique.
Cependant, la bibliothèque standard de R elle-même ne semble pas avoir une telle méthode intégrée! Une façon de contourner cela est d'utiliser une construction comme celle-ci (et de la transformer en fonction si vous utilisez souvent ...):
Pour une liste d'échantillons plus grande, on devrait envisager d'utiliser une variable temporaire pour la valeur max (tabSmpl) (je ne sais pas si R optimiserait automatiquement cela)
Référence: voir "Et la médiane et le mode?" dans cette leçon KickStarting R
Cela semble confirmer que (au moins au moment de la rédaction de cette leçon) il n'y a pas de fonction de mode dans R (enfin ... le mode () comme vous l'avez découvert est utilisé pour affirmer le type de variables ).
la source
Cela fonctionne très bien
la source
Voici une fonction pour trouver le mode:
la source
Voici le code qui peut être utilisé pour trouver le mode d'une variable vectorielle dans R.
la source
Il existe plusieurs solutions pour celle-ci. J'ai vérifié le premier et j'ai ensuite écrit le mien. L'afficher ici s'il aide quelqu'un:
Permet de le tester avec quelques exemples. Je prends l'
iris
ensemble de données. Permet de tester avec des données numériquesque vous pouvez vérifier est correct.
Désormais, le seul champ non numérique du jeu de données iris (Espèce) n'a pas de mode. Essayons avec notre propre exemple
ÉDITER
Comme mentionné dans les commentaires, l'utilisateur peut vouloir conserver le type d'entrée. Dans ce cas, la fonction mode peut être modifiée pour:
La dernière ligne de la fonction contraint simplement la valeur du mode final au type de l'entrée d'origine.
la source
y[,1] <- sort(unique(x))
J'utiliserais la fonction densité () pour identifier un maximum lissé d'une distribution (éventuellement continue):
où x est la collecte de données. Faites attention à l' ajuster paremeter de la fonction de densité qui régulent le lissage.
la source
Bien que j'aime la fonction simple de Ken Williams, j'aimerais récupérer les multiples modes s'ils existent. Dans cet esprit, j'utilise la fonction suivante qui renvoie une liste des modes s'ils sont multiples ou uniques.
la source
mode
renvoie une liste avec plusieurs valeurs, alors r [1] n'est pas la première valeur; c'est plutôt une liste de longueur 1 contenant la première valeur et vous devez faire r [[1]] pour obtenir le premier mode sous forme numérique et non une liste. Maintenant, quand il y a un seul mode, votre r n'est pas une liste donc r [1] fonctionne, c'est pourquoi je pensais qu'il était incohérent. Mais puisque r [[1]] fonctionne également lorsque r est un simple vecteur, il y a en fait une cohérence que je n'avais pas réalisée en ce que vous pouvez toujours l'utiliser[[
pour accéder aux éléments.Je regardais toutes ces options et j'ai commencé à m'interroger sur leurs caractéristiques et performances relatives, j'ai donc fait quelques tests. Au cas où quelqu'un d'autre serait curieux de savoir la même chose, je partage mes résultats ici.
Ne voulant pas se soucier de toutes les fonctions publiées ici, j'ai choisi de me concentrer sur un échantillon basé sur quelques critères: la fonction devrait fonctionner à la fois sur les vecteurs de caractère, de facteur, logiques et numériques, elle devrait traiter les NA et autres valeurs problématiques de manière appropriée, et la sortie doit être «sensible», c'est-à-dire pas de chiffres comme caractère ou autre idiotie.
J'ai également ajouté une fonction à moi, qui est basée sur la même
rle
idée que chrispy's, sauf adaptée pour une utilisation plus générale:J'ai fini par exécuter cinq fonctions, sur deux ensembles de données de test
microbenchmark
. Les noms de fonction font référence à leurs auteurs respectifs:La fonction de Chris a été définie sur
method="modes"
etna.rm=TRUE
par défaut pour la rendre plus comparable, mais à part cela, les fonctions ont été utilisées telles que présentées ici par leurs auteurs.En ce qui concerne la vitesse seule, la version Kens gagne facilement, mais elle est également la seule de celles-ci à ne signaler qu'un seul mode, peu importe le nombre. Comme c'est souvent le cas, il y a un compromis entre vitesse et polyvalence. Dans
method="mode"
, la version de Chris retournera une valeur si il n'y a qu'un mode, sinon NA. Je pense que c'est une belle touche. Je pense également qu'il est intéressant de voir comment certaines fonctions sont affectées par un nombre accru de valeurs uniques, tandis que d'autres ne le sont pas autant. Je n'ai pas étudié le code en détail pour comprendre pourquoi, à part éliminer la logique / numérique comme cause.la source
Le mode ne peut pas être utile dans toutes les situations. Donc, la fonction devrait répondre à cette situation. Essayez la fonction suivante.
Production,
la source
Cela s'appuie sur la réponse de jprockbelly, en ajoutant une accélération pour les vecteurs très courts. Ceci est utile lors de l'application du mode à un data.frame ou à une table de données avec de nombreux petits groupes:
la source
Une autre option simple qui donne toutes les valeurs classées par fréquence est d'utiliser
rle
:la source
Une autre solution possible:
Usage:
Production:
la source
Si vos observations sont des classes de nombres réels et que vous vous attendez à ce que le mode soit de 2,5 lorsque vos observations sont 2, 2, 3 et 3, vous pouvez alors estimer le mode avec
mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)
où l1 .. limite inférieure de la classe la plus fréquente, f1 . . fréquence de la classe la plus fréquente, f0 .. fréquence des classes avant la classe la plus fréquente, f2 .. fréquence des classes après la classe la plus fréquente et i .. intervalle de classe comme indiqué par exemple en 1 , 2 , 3 :Si vous voulez le niveau le plus fréquent et que vous en avez plusieurs , vous pouvez tous les obtenir, par exemple avec:
la source
Ajout d'une approche data.table possible
la source
Voici plusieurs façons de le faire en temps d'exécution Theta (N)
la source
Pourrait essayer la fonction suivante:
la source
Le mode de calcul est principalement en cas de variable de facteur, alors nous pouvons utiliser
HouseVotes84 est un ensemble de données disponible dans le package «mlbench».
il donnera la valeur maximale de l'étiquette. il est plus facile à utiliser par les fonctions intégrées elles-mêmes sans fonction d'écriture.
la source
Il me semble que si une collection a un mode, alors ses éléments peuvent être mappés un à un avec les nombres naturels. Ainsi, le problème de la recherche du mode se réduit à la production d'un tel mappage, à la recherche du mode des valeurs mappées, puis au mappage vers certains des éléments de la collection. (Le traitement
NA
se produit lors de la phase de cartographie).J'ai une
histogram
fonction qui fonctionne sur un principe similaire. (Les fonctions et opérateurs spéciaux utilisés dans le code présenté ici doivent être définis dans Shapiro et / ou dans neatOveRse . Les parties de Shapiro et neatOveRse dupliquées ici sont ainsi dupliquées avec permission; les extraits de code dupliqués peuvent être utilisés selon les termes de ce site. ) R pseudocode pourhistogram
is(Les opérateurs binaires spéciaux accomplissent la tuyauterie , le curry et la composition ) J'ai également une
maxloc
fonction, qui est similaire àwhich.max
, mais renvoie tous les maxima absolus d'un vecteur. Pseudocode R pourmaxloc
isalors
et
calculera le mode de toute collection, à condition que les fonctions
map
-ping etunmap
-ping appropriées soient définies.la source