Я переглядав усі ці варіанти і почав цікавитись їх відносними особливостями та характеристиками, тому зробив кілька тестів. Якщо комусь цікаво те саме, я ділюся своїми результатами тут.
Не бажаючи турбуватися про всі функції, розміщені тут, я вирішив зосередитись на вибірці на основі кількох критеріїв: функція повинна працювати як на характер, так і на фактор, на логічний та числовий вектори, вона повинна належним чином працювати з NA та іншими проблемними значеннями, а вихід повинен бути "розумним", тобто не має числових знаків як символів чи інших подібних глупостей.
Я також додав власну функцію, яка заснована на тій же rle
ідеї, що і хрусткі, за винятком пристосованої для більш загального використання:
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
Я закінчив виконати п'ять функцій на двох наборах тестових даних microbenchmark
. Імена функцій відносяться до відповідних авторів:
Функцію Кріса було встановлено на method="modes"
таna.rm=TRUE
за замовчуванням , щоб зробити його більш порівнянні, але крім того , що ці функції були використані як представлені тут їх авторами.
Що стосується швидкості, версія Kens легко виграє, але вона також є єдиною з них, яка повідомляє лише про один режим, незалежно від того, скільки їх насправді є. Як це часто буває, між швидкістю та універсальністю існує компроміс. У method="mode"
версії Кріса повернеться значення, якщо є один режим, а інший NA. Я думаю, що це приємний штрих. Я також думаю, що цікаво, як на деякі функції впливає збільшена кількість унікальних значень, а інші - не так вже й багато. Я детально не вивчив код, щоб з’ясувати, чому це, крім усунення логічного / числового як причини.