Stavo esaminando tutte queste opzioni e ho iniziato a chiedermi quali fossero le loro caratteristiche e prestazioni, quindi ho fatto alcuni test. Nel caso in cui qualcun altro fosse curioso della stessa cosa, sto condividendo i miei risultati qui.
Non volendo preoccuparmi di tutte le funzioni pubblicate qui, ho scelto di concentrarmi su un campione basato su alcuni criteri: la funzione dovrebbe funzionare su caratteri, fattori, vettori logici e numerici, dovrebbe occuparsi in modo appropriato di NA e altri valori problematici, e l'output dovrebbe essere "sensato", cioè nessun valore numerico come carattere o altra stupidità simile.
Ho anche aggiunto una mia funzione, che si basa sulla stessa rle
idea di Chrispy, tranne adattata per un uso più generale:
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
Ho finito per eseguire cinque funzioni, su due set di dati di test, attraverso microbenchmark
. I nomi delle funzioni si riferiscono ai rispettivi autori:
La funzione di Chris è stata impostata su method="modes"
e na.rm=TRUE
per impostazione predefinita per renderla più comparabile, ma a parte questo sono state utilizzate le funzioni presentate qui dai loro autori.
Per quanto riguarda la velocità, solo la versione di Kens vince facilmente, ma è anche l'unica di queste che segnalerà solo una modalità, non importa quante ce ne siano davvero. Come spesso accade, c'è un compromesso tra velocità e versatilità. In method="mode"
, la versione di Chris restituirà un valore se esiste una modalità, altrimenti NA. Penso che sia un bel tocco. Penso anche che sia interessante come alcune funzioni siano influenzate da un numero crescente di valori univoci, mentre altre non sono altrettanto. Non ho studiato il codice in dettaglio per capire perché, oltre a eliminare logico / numerico come causa.