Saya melihat-lihat semua opsi ini dan mulai bertanya-tanya tentang fitur dan penampilan relatif mereka, jadi saya melakukan beberapa tes. Jika ada orang yang ingin tahu tentang hal yang sama, saya membagikan hasil saya di sini.
Tidak ingin repot dengan semua fungsi yang diposting di sini, saya memilih untuk fokus pada sampel berdasarkan beberapa kriteria: fungsi tersebut harus bekerja pada kedua karakter, vektor faktor, logis dan numerik, harus berurusan dengan NAS dan nilai bermasalah lainnya dengan tepat, dan output harus 'masuk akal', yaitu tidak ada angka sebagai karakter atau kekonyolan lainnya.
Saya juga menambahkan fungsi saya sendiri, yang didasarkan pada rle
ide yang sama dengan chrispy, kecuali diadaptasi untuk penggunaan yang lebih umum:
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
Saya akhirnya menjalankan lima fungsi, pada dua set data uji, sampai microbenchmark
. Nama fungsi merujuk ke penulis masing-masing:
Fungsi Chris diatur ke method="modes"
danna.rm=TRUE
secara default untuk membuatnya lebih sebanding, tetapi selain itu fungsi digunakan seperti yang disajikan di sini oleh penulisnya.
Dalam hal kecepatan saja, versi Kens menang dengan mudah, tetapi ini juga satu-satunya yang hanya akan melaporkan satu mode, tidak peduli berapa banyak sebenarnya. Seperti yang sering terjadi, ada pertukaran antara kecepatan dan keserbagunaan. Dalam method="mode"
, versi Chris akan mengembalikan nilai jika ada satu mode, selain itu NA. Saya pikir itu sentuhan yang bagus. Saya juga berpikir itu menarik bagaimana beberapa fungsi dipengaruhi oleh peningkatan jumlah nilai unik, sementara yang lain tidak sebanyak. Saya belum mempelajari kode secara rinci untuk mencari tahu mengapa itu, selain menghilangkan logis / numerik sebagai penyebabnya.