В р среднее () и медиана () являются стандартными функциями, которые делают то, что вы'd не ожидал. режим()
говорит вам внутренний режим хранения объекта, а не значение, которое встречается наиболее в своей аргументации. Но есть стандартная библиотечная функция, которая реализует статистический режим на вектор (или список)?
Еще одно решение, которое работает для числовых & символ/данные по коэффициентам:
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
На мой изящный маленький автомат, который может генерировать & найти режим векторного 10М-целое число примерно полсекунды.
Если набор данных может иметь несколько режимов, вышеуказанные решение принимает тот же подход, которым.Макс, и возвращает во-первых, появляется стоимость набор режимов. Вернуться всех режимы, использовать этот вариант (от @digEmAll в комментариях):
Modes <- function(x) {
ux <- unique(x)
tab <- tabulate(match(x, ux))
ux[tab == max(tab)]
}
Есть пакет `modeest для оценки режима одномерной унимодальной (а иногда и смешанных) данных и значений режимов обычного распределения вероятностей.
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")
Для получения более подробной информации см. Страница
нашел это в списке рассылки Р, надеюсь, что это's полезн. Это тоже, о чем я думала в любом случае. Вы'll хочу таблицу() данные, отсортировать, а затем выбрать имя. Это'ы программистские, но должен работать.
names(sort(-table(x)))[1]
Я нашел Кен Вильямс пост выше, чтобы быть великим, я добавил несколько строк для учета значений Na и сделали это функция для удобства.
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)))])
}
Быстрый и грязный способ оценки режима вектора чисел вы считаете, родом из непрерывного распределения одномерной (например, нормальное распределение) - определение и используя следующую функцию:
estimate_mode <- function(x) {
d <- density(x)
d$x[which.max(d$y)]
}
Затем получить оценку режима:
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
Следующая функция поставляется в трех формах:
способ = "в режим" [по умолчанию]: вычисляет режим для унимодальных вектор, иначе возвращает на способ = "в nmodes", которая: подсчитывает количество режимов в векторе способ = на "режимы", которая: выводит список всех режимов для унимодальной или полимодальным вектор
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()
}
Я могу'т голосовать, но Расмус Бååче'ответом является то, что я искал. Однако, я бы немного его доработать, позволяющие contrain распределения, например, от значения только между 0 и 1.
estimate_mode <- function(x,from=min(x), to=max(x)) {
d <- density(x, from=from, to=to)
d$x[which.max(d$y)]
}
Мы понимаем, что вы не хотите ограничивать на все ваши рассылки, а затем установить с=-с"Большая цифра" В, В=С"огромное количество"и
Небольшая модификация для Кен Уильямс' ответ, добавления дополнительных параметров НС.РМ " и " return_multiple`.
В отличие от ответы, опираясь на именах(), этот ответ хранит тип данных
X` в возвращаемое значение(ы).
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])
}
Чтобы показать он работает с дополнительным params и поддерживает тип данных:
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"
Спасибо @Фрэнк для упрощения.
Я'вэ написал следующий код для того, чтобы создать режим.
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)))
}
Позвольте'ы попробовать это:
MODE(mtcars)
MODE(CO2)
MODE(ToothGrowth)
MODE(InsectSprays)
На основе @Крис's в функцию для расчета режима или взаимосвязанные показатели, однако, используя Кен Вильямс'ы метод для расчета частот. Это обеспечивает исправление для случая без модов вообще (все элементы с одинаковой частотой), и некоторые более читабельным метод
имена.
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'")
}
Поскольку он использует Кен'ы метод для расчета частот производительность и оптимизированы, используя Аксела'ы пост я протестированные некоторые из предыдущих ответов, чтобы показать, как моя функция рядом с Кен's в производительности, с условные конструкции для различных вариантов выхода вызывая лишь незначительные надбавки:
Вот функция, чтобы найти режим:
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)
}
Это работает довольно хорошо
> a<-c(1,1,2,2,3,3,4,4,5)
> names(table(a))[table(a)==max(table(a))]
R имеет очень много дополнительных пакетов, что некоторые из них вполне могут обеспечить [статистических] режим числового списка/серия/вектор.
Однако стандартная библиотека Р сама не'т, кажется, есть такой встроенный метод! Один из способов обойти это, чтобы использовать некоторые сконструировать так (и превратить это в функцию, если вы часто используете...):
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
Для большего списка образец, следует учитывать, используя временную переменную для Макса(tabSmpl) значение (я не'т знаем, что R будет автоматически оптимизировать этот)
Ссылка: см. "как о медиана и мода?" в этой Кикстарт урок Р<БР> Это подтверждает, что (по крайней мере на момент написания этого урока) нет'т функция режиме в р (ну... режиме() как вы узнали, используется для установления типа переменных).
Ниже представлен код, который можно использовать, чтобы найти режим векторной переменной в р.
a <- table([vector])
names(a[a==max(a)])
Есть несколько решений для этого. Я проверил сначала одну, а после этого написал свой. Отправляю это здесь, если это поможет кто-нибудь:
Mode <- function(x){
y <- data.frame(table(x))
y[y$Freq == max(y$Freq),1]
}
Позволяет проверить его с несколько примеров. Я беру Ирис
набор данных. Давайте тест с числовыми данными
> Mode(iris$Sepal.Length)
[1] 5
которые вы можете проверить.
Теперь только для числовых полей в набор данных Iris(виды) не имеют режима. Позвольте's тест на собственном примере
> test <- c("red","red","green","blue","red")
> Mode(test)
[1] red
Как уже упоминалось в комментариях, пользователь может хотите сохранить тип ввода. В этом случае режим работы может быть изменен на:
Mode <- function(x){
y <- data.frame(table(x))
z <- y[y$Freq == max(y$Freq),1]
as(as.character(z),class(x))
}
В последней строке функция просто преобразует конечное значение режим к типа исходных данных.
Режим может'т быть полезны в каждой ситуации. Поэтому функцию должен решить эту ситуацию. Попробуйте следующую функцию.
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)
}
Выход,
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."
Я хотел бы использовать плотность (функцию) для определения сглаженный максимум (возможно, постоянной) распределение :
function(x) density(x, 2)$x[density(x, 2)$y == max(density(x, 2)$y)]
где X-это сбор данных. Обратите внимание на настройки параметры функции плотности, которые регулируют сглаживания.
Это основывается на jprockbelly'ы ответ, добавив ускорения для очень коротких векторов. Это полезно при применении режима на данные.рама или DataTable с большим количеством малых группах:
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)))]
}