ฉันกำลังดูตัวเลือกทั้งหมดเหล่านี้และเริ่มสงสัยเกี่ยวกับคุณสมบัติและการแสดงของพวกเขาดังนั้นฉันจึงทำการทดสอบบางอย่าง ในกรณีที่คนอื่นอยากรู้เกี่ยวกับเรื่องเดียวกันฉันแบ่งปันผลของฉันที่นี่
ไม่ต้องการยุ่งเกี่ยวกับฟังก์ชั่นทั้งหมดที่โพสต์ที่นี่ฉันเลือกที่จะมุ่งเน้นไปที่ตัวอย่างตามเกณฑ์ไม่กี่: ฟังก์ชั่นควรทำงานทั้งตัวละครปัจจัยตรรกะและเวกเตอร์ตัวเลขมันควรจัดการกับ NAs และค่าที่มีปัญหาอื่น ๆ อย่างเหมาะสม และผลลัพธ์ควรเป็น 'เหมาะสม' เช่นไม่มีตัวเลขเป็นตัวละครหรือความงี่เง่าอื่น ๆ
ฉันยังเพิ่มฟังก์ชั่นของตัวเองซึ่งขึ้นอยู่กับ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
ฉันสิ้นสุดการทำงานห้าหน้าที่ในสองชุดของข้อมูลการทดสอบผ่าน ชื่อฟังก์ชั่นหมายถึงผู้เขียนที่เกี่ยวข้อง:
ฟังก์ชั่นของ Chris ได้รับการตั้งค่าเป็นmethod="modes"
และna.rm=TRUE
โดยค่าเริ่มต้นเพื่อให้สามารถเปรียบเทียบได้มากกว่า แต่นอกเหนือจากนั้นฟังก์ชั่นดังกล่าวถูกใช้โดยผู้เขียน
ในเรื่องของความเร็วเพียงอย่างเดียว Kens เวอร์ชั่นชนะได้อย่างคล่องแคล่ว แต่มันก็เป็นเพียงหนึ่งในนั้นที่จะรายงานเพียงโหมดเดียวไม่ว่าจะมีกี่คนก็ตาม บ่อยครั้งที่มีการแลกเปลี่ยนระหว่างความเร็วและความสามารถรอบตัว ในmethod="mode"
เวอร์ชันของ Chris จะคืนค่าถ้ามีหนึ่งโหมดคือ NA ฉันคิดว่ามันเป็นสิ่งที่ดี ฉันยังคิดว่ามันน่าสนใจว่าฟังก์ชั่นบางอย่างได้รับผลกระทบจากการเพิ่มค่าที่ไม่ซ้ำใครในขณะที่บางฟังก์ชั่นนั้นไม่มาก ฉันยังไม่ได้ศึกษารายละเอียดของรหัสเพื่อหาสาเหตุที่นอกเหนือจากการกำจัดลอจิคัล / ตัวเลขเป็นสาเหตุ