Di R, mean()
dan rata-rata()
adalah fungsi standar yang melakukan apa yang anda'd harapkan. mode()
memberitahu anda penyimpanan internal mode objek, bukan nilai yang terjadi paling dalam argumen. Tapi ada standar fungsi perpustakaan yang menerapkan statistik mode untuk vektor (atau klik disini)?
Satu lagi solusi, yang bekerja untuk kedua numerik & karakter/data faktor:
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
Pada saya kecil mungil mesin, yang dapat menghasilkan & menemukan modus 10M-integer vektor dalam waktu sekitar setengah detik.
Jika anda mengatur data mungkin memiliki beberapa mode, solusi di atas mengambil pendekatan yang sama sebagai yang.max
, dan kembali pertama-muncul nilai set mode. Untuk kembali semua mode, gunakan varian ini (dari @digEmAll di komentar):
Modes <- function(x) {
ux <- unique(x)
tab <- tabulate(match(x, ux))
ux[tab == max(tab)]
}
Ada paket modeest
yang memberikan penduga dari modus univariat unimodal (dan kadang-kadang multimodal) data dan nilai-nilai dari mode biasa distribusi probabilitas.
mySamples <- c(19, 4, 5, 7, 29, 19, 29, 13, 25, 19)
library(modeest)
mlv(mySamples, method = "mfv")
Mode (most likely value): 19
Bickel's modal skewness: -0.1
Call: mlv.default(x = mySamples, method = "mfv")
Untuk informasi lebih lanjut lihat di halaman ini
Saya menemukan Ken Williams posting di atas untuk menjadi besar, saya menambahkan beberapa baris ke akun NA nilai-nilai dan membuat sebuah fungsi untuk kemudahan.
Mode <- function(x, na.rm = FALSE) {
if(na.rm){
x = x[!is.na(x)]
}
ux <- unique(x)
return(ux[which.max(tabulate(match(x, ux)))])
}
Cepat dan kotor cara memperkirakan modus vektor dari angka yang anda percaya berasal dari continous univariat distribusi (misalnya distribusi normal) adalah mendefinisikan dan menggunakan fungsi berikut:
estimate_mode <- function(x) {
d <- density(x)
d$x[which.max(d$y)]
}
Kemudian untuk mendapatkan mode perkiraan:
x <- c(5.8, 5.6, 6.2, 4.1, 4.9, 2.4, 3.9, 1.8, 5.7, 3.2)
estimate_mode(x)
## 5.439788
Fungsi berikut ini datang dalam tiga bentuk:
metode = "mode" [default]: menghitung modus untuk unimodal vektor, yang lain kembali NA metode = "nmodes": menghitung jumlah mode di vektor metode = "mode": daftar semua mode untuk unimodal atau polymodal vektor
modeav <- function (x, method = "mode", na.rm = FALSE)
{
x <- unlist(x)
if (na.rm)
x <- x[!is.na(x)]
u <- unique(x)
n <- length(u)
#get frequencies of each of the unique values in the vector
frequencies <- rep(0, n)
for (i in seq_len(n)) {
if (is.na(u[i])) {
frequencies[i] <- sum(is.na(x))
}
else {
frequencies[i] <- sum(x == u[i], na.rm = TRUE)
}
}
#mode if a unimodal vector, else NA
if (method == "mode" | is.na(method) | method == "")
{return(ifelse(length(frequencies[frequencies==max(frequencies)])>1,NA,u[which.max(frequencies)]))}
#number of modes
if(method == "nmode" | method == "nmodes")
{return(length(frequencies[frequencies==max(frequencies)]))}
#list of all modes
if (method == "modes" | method == "modevalues")
{return(u[which(frequencies==max(frequencies), arr.ind = FALSE, useNames = FALSE)])}
#error trap the method
warning("Warning: method not recognised. Valid methods are 'mode' [default], 'nmodes' and 'modes'")
return()
}
Saya dapat't pemungutan suara belum tapi Rasmus Bååth's jawaban adalah apa yang saya cari. Namun, saya akan memodifikasi sedikit memungkinkan untuk kontraindikasi, yang mel distribusi misalnya mondar-mandir nilai-nilai antara 0 dan 1.
estimate_mode <- function(x,from=min(x), to=max(x)) {
d <- density(x, from=from, to=to)
d$x[which.max(d$y)]
}
Kami menyadari bahwa anda mungkin tidak ingin membatasi pada semua distribusi anda, kemudian set dari=-"BESAR", untuk="BESAR"
Sedikit modifikasi untuk Ken Williams' menjawab, menambahkan opsional params na.rm
dan return_multiple
.
Tidak seperti jawaban mengandalkan nama-nama(), ini jawaban mempertahankan jenis data
x` di nilai kembali(s).
stat_mode <- function(x, return_multiple = TRUE, na.rm = FALSE) {
if(na.rm){
x <- na.omit(x)
}
ux <- unique(x)
freq <- tabulate(match(x, ux))
mode_loc <- if(return_multiple) which(freq==max(freq)) else which.max(freq)
return(ux[mode_loc])
}
Untuk menunjukkan kerjanya dengan opsional params dan mempertahankan tipe data:
foo <- c(2L, 2L, 3L, 4L, 4L, 5L, NA, NA)
bar <- c('mouse','mouse','dog','cat','cat','bird',NA,NA)
str(stat_mode(foo)) # int [1:3] 2 4 NA
str(stat_mode(bar)) # chr [1:3] "mouse" "cat" NA
str(stat_mode(bar, na.rm=T)) # chr [1:2] "mouse" "cat"
str(stat_mode(bar, return_mult=F, na.rm=T)) # chr "mouse"
Terima kasih untuk @Frank untuk penyederhanaan.
I've tertulis kode berikut dalam rangka untuk menghasilkan mode.
MODE <- function(dataframe){
DF <- as.data.frame(dataframe)
MODE2 <- function(x){
if (is.numeric(x) == FALSE){
df <- as.data.frame(table(x))
df <- df[order(df$Freq), ]
m <- max(df$Freq)
MODE1 <- as.vector(as.character(subset(df, Freq == m)[, 1]))
if (sum(df$Freq)/length(df$Freq)==1){
warning("No Mode: Frequency of all values is 1", call. = FALSE)
}else{
return(MODE1)
}
}else{
df <- as.data.frame(table(x))
df <- df[order(df$Freq), ]
m <- max(df$Freq)
MODE1 <- as.vector(as.numeric(as.character(subset(df, Freq == m)[, 1])))
if (sum(df$Freq)/length(df$Freq)==1){
warning("No Mode: Frequency of all values is 1", call. = FALSE)
}else{
return(MODE1)
}
}
}
return(as.vector(lapply(DF, MODE2)))
}
Let's mencobanya:
MODE(mtcars)
MODE(CO2)
MODE(ToothGrowth)
MODE(InsectSprays)
Berdasarkan @Chris's fungsi untuk menghitung modus atau metrik terkait, namun menggunakan Ken Williams's metode untuk menghitung frekuensi. Yang satu ini menyediakan perbaikan untuk kasus tidak ada mode pada semua (semua elemen sama-sama sering), dan beberapa lebih mudah dibaca metode
nama.
Mode <- function(x, method = "one", na.rm = FALSE) {
x <- unlist(x)
if (na.rm) {
x <- x[!is.na(x)]
}
# Get unique values
ux <- unique(x)
n <- length(ux)
# Get frequencies of all unique values
frequencies <- tabulate(match(x, ux))
modes <- frequencies == max(frequencies)
# Determine number of modes
nmodes <- sum(modes)
nmodes <- ifelse(nmodes==n, 0L, nmodes)
if (method %in% c("one", "mode", "") | is.na(method)) {
# Return NA if not exactly one mode, else return the mode
if (nmodes != 1) {
return(NA)
} else {
return(ux[which(modes)])
}
} else if (method %in% c("n", "nmodes")) {
# Return the number of modes
return(nmodes)
} else if (method %in% c("all", "modes")) {
# Return NA if no modes exist, else return all modes
if (nmodes > 0) {
return(ux[which(modes)])
} else {
return(NA)
}
}
warning("Warning: method not recognised. Valid methods are 'one'/'mode' [default], 'n'/'nmodes' and 'all'/'modes'")
}
Karena menggunakan Ken's metode untuk menghitung frekuensi kinerja juga dioptimalkan, menggunakan AkselA's post saya mengacu kepada beberapa jawaban sebelumnya untuk menunjukkan bagaimana fungsi saya dekat dengan Ken's dalam kinerja, dengan pengandaian untuk berbagai ouput opsi menyebabkan hanya sedikit overhead:
Berikut ini adalah fungsi untuk menemukan mode:
mode <- function(x) {
unique_val <- unique(x)
counts <- vector()
for (i in 1:length(unique_val)) {
counts[i] <- length(which(x==unique_val[i]))
}
position <- c(which(counts==max(counts)))
if (mean(counts)==max(counts))
mode_x <- 'Mode does not exist'
else
mode_x <- unique_val[position]
return(mode_x)
}
R memiliki begitu banyak add-on paket bahwa beberapa dari mereka mungkin juga memberikan [statistik] mode numerik daftar/seri/vektor.
Namun perpustakaan standar R itu sendiri doesn't tampaknya memiliki built-in metode! Salah satu cara untuk mengatasi ini adalah dengan menggunakan beberapa konstruk seperti berikut (dan untuk mengubah ini untuk fungsi jika sering anda gunakan...):
mySamples <- c(19, 4, 5, 7, 29, 19, 29, 13, 25, 19)
tabSmpl<-tabulate(mySamples)
SmplMode<-which(tabSmpl== max(tabSmpl))
if(sum(tabSmpl == max(tabSmpl))>1) SmplMode<-NA
> SmplMode
[1] 19
Untuk yang lebih besar daftar sampel, salah satu harus mempertimbangkan menggunakan variabel sementara untuk max(tabSmpl) nilai (I don't tahu bahwa R akan secara otomatis mengoptimalkan ini)
Referensi: lihat "Bagaimana median, dan modus?" dalam hal ini membantu mendorong R pelajaran
Hal ini tampaknya untuk mengkonfirmasi bahwa (setidaknya dari penulisan ini pelajaran) ada isn't mode fungsi R (yah... mode() seperti yang anda tahu ini digunakan untuk menyatakan jenis variabel).
Ada beberapa solusi yang ditawarkan untuk yang satu ini. Saya telah memeriksa yang pertama dan setelah itu menulis saya sendiri. Posting di sini jika itu membantu siapa saja:
Mode <- function(x){
y <- data.frame(table(x))
y[y$Freq == max(y$Freq),1]
}
Mari kita uji dengan beberapa contoh. Saya mengambil iris
set data. Mari kita uji dengan data numerik
> Mode(iris$Sepal.Length)
[1] 5
yang dapat anda memverifikasi benar.
Sekarang satu-satunya non-numerik bidang dalam dataset iris(Spesies) tidak memiliki modus. Let's test dengan kita sendiri contoh
> test <- c("red","red","green","blue","red")
> Mode(test)
[1] red
Seperti yang disebutkan di komentar, pengguna mungkin ingin untuk melestarikan jenis input. Dalam hal fungsi mode dapat dimodifikasi untuk:
Mode <- function(x){
y <- data.frame(table(x))
z <- y[y$Freq == max(y$Freq),1]
as(as.character(z),class(x))
}
Baris terakhir dari fungsi hanya membujuk akhir nilai modus untuk jenis input asli.
Mode dapat't akan berguna dalam setiap situasi. Jadi fungsi harus mengatasi situasi ini. Mencoba fungsi berikut.
Mode <- function(v) {
# checking unique numbers in the input
uniqv <- unique(v)
# frquency of most occured value in the input data
m1 <- max(tabulate(match(v, uniqv)))
n <- length(tabulate(match(v, uniqv)))
# if all elements are same
same_val_check <- all(diff(v) == 0)
if(same_val_check == F){
# frquency of second most occured value in the input data
m2 <- sort(tabulate(match(v, uniqv)),partial=n-1)[n-1]
if (m1 != m2) {
# Returning the most repeated value
mode <- uniqv[which.max(tabulate(match(v, uniqv)))]
} else{
mode <- "Two or more values have same frequency. So mode can't be calculated."
}
} else {
# if all elements are same
mode <- unique(v)
}
return(mode)
}
Output,
x1 <- c(1,2,3,3,3,4,5)
Mode(x1)
# [1] 3
x2 <- c(1,2,3,4,5)
Mode(x2)
# [1] "Two or more varibles have same frequency. So mode can't be calculated."
x3 <- c(1,1,2,3,3,4,5)
Mode(x3)
# [1] "Two or more values have same frequency. So mode can't be calculated."
Saya akan menggunakan kepadatan() berfungsi untuk mengidentifikasi merapikan maksimal (mungkin terus-menerus) distribusi :
function(x) density(x, 2)$x[density(x, 2)$y == max(density(x, 2)$y)]
di mana x adalah pengumpulan data. Memperhatikan menyesuaikan paremeter kepadatan fungsi yang mengatur smoothing.
Ini didasarkan pada jprockbelly's jawaban, dengan menambahkan kecepatan up untuk sangat pendek vektor. Hal ini berguna ketika menerapkan modus untuk data.frame atau datatable dengan banyak kelompok-kelompok kecil:
Mode <- function(x) {
if ( length(x) <= 2 ) return(x[1])
if ( anyNA(x) ) x = x[!is.na(x)]
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}