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:
library(magrittr)
Aksel <- function(x, freq=FALSE) {
z <- 2
if (freq) z <- 1:2
run <- x %>% as.vector %>% sort %>% rle %>% unclass %>% data.frame
colnames(run) <- c("freq", "value")
run[which(run$freq==max(run$freq)), z] %>% as.vector
}
set.seed(2)
F <- sample(c("yes", "no", "maybe", NA), 10, replace=TRUE) %>% factor
Aksel(F)
# [1] maybe yes
C <- sample(c("Steve", "Jane", "Jonas", "Petra"), 20, replace=TRUE)
Aksel(C, freq=TRUE)
# freq value
# 7 Steve
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"
et na.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.