Ich habe all diese Optionen durchgesehen und mich über ihre relativen Merkmale und Leistungen gewundert, also habe ich einige Tests durchgeführt. Falls jemand anderes neugierig ist, teile ich meine Ergebnisse hier.
Da ich mich nicht um alle hier veröffentlichten Funktionen kümmern wollte, konzentrierte ich mich auf ein Beispiel, das auf einigen Kriterien beruhte: Die Funktion sollte sowohl mit Zeichen-, Faktor-, logischen als auch numerischen Vektoren arbeiten, mit NAs und anderen problematischen Werten angemessen umgehen. und die Ausgabe sollte "vernünftig" sein, dh keine Zahlen als Zeichen oder andere solche Dummheiten.
Ich habe auch eine eigene Funktion hinzugefügt, die auf der gleichen rle
Idee wie die von chrispy basiert, außer für eine allgemeinere Verwendung angepasst:
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
Am Ende habe ich fünf Funktionen auf zwei Testdatensätzen ausgeführt microbenchmark
. Die Funktionsnamen beziehen sich auf die jeweiligen Autoren:
Chris 'Funktion war auf method="modes"
und eingestelltna.rm=TRUE
standardmäßig , um sie vergleichbarer zu machen. Ansonsten wurden die Funktionen so verwendet, wie sie hier von ihren Autoren vorgestellt wurden.
Allein in Bezug auf die Geschwindigkeit gewinnt die Kens-Version problemlos, aber es ist auch die einzige, die nur einen Modus meldet, egal wie viele es tatsächlich gibt. Wie so oft gibt es einen Kompromiss zwischen Geschwindigkeit und Vielseitigkeit. In method="mode"
Chris 'Version wird ein Wert zurückgegeben, wenn es einen Modus gibt, andernfalls NA. Ich denke, das ist eine nette Geste. Ich finde es auch interessant, wie einige Funktionen von einer erhöhten Anzahl eindeutiger Werte beeinflusst werden, während andere bei weitem nicht so stark sind. Ich habe den Code nicht im Detail studiert, um herauszufinden, warum das so ist, abgesehen davon, dass logisch / numerisch als Ursache beseitigt wurde.