Tôi đã xem qua tất cả các tùy chọn này và bắt đầu tự hỏi về các tính năng và hiệu suất tương đối của chúng, vì vậy tôi đã thực hiện một số thử nghiệm. Trong trường hợp bất kỳ ai khác tò mò về điều tương tự, tôi sẽ chia sẻ kết quả của mình ở đây.
Không muốn bận tâm về tất cả các hàm được đăng ở đây, tôi đã chọn tập trung vào một mẫu dựa trên một vài tiêu chí: hàm phải hoạt động trên cả vectơ ký tự, yếu tố, logic và số, nên xử lý NA và các giá trị có vấn đề khác một cách thích hợp, và đầu ra phải là "hợp lý", tức là không có số nào là ký tự hoặc độ silliness khác.
Tôi cũng đã thêm một chức năng của riêng mình, dựa trên rle
ý tưởng tương tự như chrispy, ngoại trừ điều chỉnh cho sử dụng chung hơn:
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
Cuối cùng tôi đã chạy năm chức năng, trên hai bộ dữ liệu thử nghiệm microbenchmark
. Các tên hàm đề cập đến các tác giả tương ứng của họ:
Chức năng của Chris đã được đặt thành method="modes"
vàna.rm=TRUE
theo mặc định để làm cho nó có thể so sánh hơn, nhưng ngoài chức năng đó được sử dụng như được trình bày ở đây bởi các tác giả của họ.
Về vấn đề tốc độ, một mình phiên bản Zack chiến thắng một cách khéo léo, nhưng đây cũng là phiên bản duy nhất trong số này sẽ chỉ báo cáo một chế độ, bất kể có bao nhiêu thực sự có. Như thường lệ, có một sự đánh đổi giữa tốc độ và tính linh hoạt. Trongmethod="mode"
, phiên bản của Chris sẽ trả về một giá trị nếu có một chế độ, NA khác. Tôi nghĩ đó là một liên lạc tốt đẹp. Tôi cũng nghĩ thật thú vị khi một số chức năng bị ảnh hưởng bởi số lượng giá trị duy nhất tăng lên, trong khi những chức năng khác không nhiều như vậy. Tôi đã không nghiên cứu chi tiết mã để tìm hiểu lý do tại sao, ngoài việc loại bỏ logic / số là nguyên nhân.