Я просматривал все эти варианты и начал задумываться об их относительных характеристиках и характеристиках, поэтому я провел несколько тестов. В случае, если кому-то еще интересно то же самое, я поделюсь своими результатами здесь.
Не желая беспокоиться обо всех функциях, опубликованных здесь, я решил сосредоточиться на выборке, основанной на нескольких критериях: функция должна работать как на символьном, факторном, так и на логическом и числовом векторах, она должна иметь дело с NA и другими проблемными значения соответственно, и выходные данные должны быть «разумными», то есть не иметь числовых значений в виде символов или других подобных глупостей.
Я также добавил собственную функцию, основанную на той же идее rle
, что и у chrispy, за исключением адаптированной для более общего использования:
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
. Названия функций относятся к их авторам:
![enter image description here](https://i.stack.imgur.com/yg3RH.png)
Функция Криса была установлена на method="modes"
и na.rm=TRUE
по умолчанию, чтобы сделать ее более сопоставимой, но помимо этого функции использовались, как представлено здесь их авторами.
В зависимости от скорости, версия Kens выигрывает легко, но она также является единственной, которая сообщает только об одном режиме, независимо от того, сколько на самом деле их существует. Как это часто бывает, существует компромисс между скоростью и универсальностью. В method="mode"
версия Криса вернет значение, если есть один режим, иначе NA. Я думаю, что это приятное прикосновение.
Я также думаю, что интересно, как на некоторые функции влияет увеличение числа уникальных значений, в то время как на другие это не так сильно. Я не изучил код подробно, чтобы выяснить, почему это так, кроме устранения логической / числовой причины.