Eu estava analisando todas essas opções e comecei a me perguntar sobre suas características e desempenhos relativos, então fiz alguns testes. Caso alguém mais tenha curiosidade sobre o mesmo, estou compartilhando meus resultados aqui.
Não querendo se preocupar com todas as funções postadas aqui, optei por focar em uma amostra com base em alguns critérios: a função deve funcionar com caracteres, fatores, vetores lógicos e numéricos, deve lidar com NAs e outros valores problemáticos de forma adequada, e a saída deve ser 'sensata', ou seja, nenhum número como caractere ou outra bobagem.
Também adicionei uma função própria, que é baseada na mesma rle
idéia que a de chrispy, exceto adaptada para uso mais geral:
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
Acabei executando cinco funções, em dois conjuntos de dados de teste microbenchmark
. Os nomes das funções se referem aos seus respectivos autores:
A função de Chris foi definida como method="modes"
ena.rm=TRUE
por padrão para torná-la mais comparável, mas, além disso, as funções foram usadas conforme apresentadas aqui por seus autores.
Apenas em questão de velocidade, a versão Kens vence com facilidade, mas também é a única que relatará apenas um modo, não importa quantos realmente existam. Como costuma ser o caso, há uma troca entre velocidade e versatilidade. Na method="mode"
versão de Chris retornará um valor se houver um modo, senão NA. Eu acho que é um toque legal. Também acho interessante como algumas das funções são afetadas por um número maior de valores únicos, enquanto outras não são quase o mesmo. Não estudei o código em detalhes para descobrir por que, além de eliminar a lógica / numérica como causa.