我浏览了所有这些选项,并开始想知道它们的相关功能和性能,所以我做了一些测试。如果其他人对此感到好奇,我将在这里分享我的结果。
不想打扰这里发布的所有函数,我选择关注基于几个标准的示例:该函数应该适用于字符、因子、逻辑和数字向量,它应该处理 NA 和其他问题适当的值,并且输出应该是“明智的”,即没有数字作为字符或其他类似的愚蠢。
我还添加了一个我自己的函数,它基于与 chrispy 相同的 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 在两组测试数据上运行了五个函数。函数名称参考各自的作者:
Chris 的函数默认设置为 method="modes" 和 na.rm=TRUE 以使其更具可比性,但除此之外,这些函数由其作者在此处提供。
仅在速度方面,Kens 版本轻松获胜,但它也是其中唯一一款只会报告一种模式的版本,无论实际有多少。通常情况下,需要在速度和多功能性之间进行权衡。在method="mode" 中,如果存在一种模式,则 Chris 的版本将返回一个值,否则返回 NA。我认为这是一个很好的接触。
我还认为有趣的是,一些函数如何受到唯一值数量增加的影响,而其他函数则几乎没有。除了消除逻辑/数字作为原因之外,我还没有详细研究代码以找出原因。