是否有用于查找模式的内置功能?


391

在R,mean()并且median()是该做你所期望的标准功能。 mode()告诉您对象的内部存储模式,而不是在其参数中出现最多的值。但是是否有一个标准库函数实现矢量(或列表)的统计模式?


4
您需要澄清您的数据是否为整数,数字,因子...?数字的模式估计将有所不同,并使用间隔。见谦虚
smci 2012年

2
为什么R没有模式的内置函数?为什么R认为mode与函数相同class
科里·莱文森

Answers:


400

另一种解决方案,适用于数字和字符/因数数据:

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

在我的小型机械上,它可以在大约半秒钟内生成并找到10M整数矢量的模式。

如果您的数据集可能具有多种模式,则上述解决方案采用与相同的方法which.max,并返回模式集的第一个出现的值。要返回所有模式,请使用以下变体(在注释中来自@digEmAll):

Modes <- function(x) {
  ux <- unique(x)
  tab <- tabulate(match(x, ux))
  ux[tab == max(tab)]
}

7
也适用于逻辑!保留所有类型的向量的数据类型(与其他答案中的某些实现不同)。
DavidC

39
在多模式数据集(例如c(1,1,2,2))的情况下,这不会返回所有模式。您应使用以下命令更改最后一行:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
digEmAll 2014年

6
@verybadatthis为此,您将替换ux[which.max(tabulate(match(x, ux)))]为just max(tabulate(match(x, ux)))
肯·威廉姆斯

4
您会注意到Mode(1:3)Give 1Mode(3:1)Give 3,所以Mode返回最常出现的元素,如果所有元素都是唯一的,则返回第一个。
恩里克·佩雷斯·埃雷罗

2
正如Enrique所说:如果没有模式,此操作将失败,而给您的印象是第一个值是模式。如果它返回0NA在这种情况下,本来会更好。
not2qubit

66

有一个软件包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")

有关更多信息,请参见此页面


7
因此,仅获得模式值mfv(mySamples)[1]。该1是重要的,因为它实际上返回最频繁的价值小号
原子

在此示例中似乎不起作用:库(最适)a <-rnorm(50,30,2)b <-rnorm(100,35,2)c <-rnorm(20,37,2)温度ºC<- c(a,b,c)hist(温度ºC)#平均值abline(v =平均值(温度ºC),col =“ red”,lwd = 2)#median基线(v = median(温度ºC),col =“ black”, lwd = 2)#mode abline(v = mlv(温度ºC,方法=“ mfv”)[1],col =“ orange”,lwd = 2)
Agus camacho

1
@atomicules:使用[1],您仅获得第一个模式。对于双峰分布或一般n mfv(mySamples)

1
对于R版本3.6.0,它说函数'找不到函数“ mlv”',并且在尝试mfv(mysamples)时出现相同的错误。折旧了吗?
Nisha Arora博士,

@DrNishaArora:您下载了“最适度”的软件包吗?
petzi

59

在r邮件列表中找到了此邮件,希望对您有所帮助。无论如何,这也是我一直在想的。您将需要对数据进行table(),排序,然后选择名字。它有点黑,但应该可以。

names(sort(-table(x)))[1]

6
这也是一个聪明的解决方法。它有一些缺点:与基于max()的方法相比,排序算法可能会占用更多的空间和时间(对于更大的样本列表,应避免使用=>)。同样,输出是“字符”模式而不是“数字”模式(双关语/歧义)。而且,当然,需要测试多模式分布通常会需要存储已排序的表,以避免重新处理它。
mjv 2010年

2
我用1e6个元素测量了运行时间,该解决方案比公认的答案快了几乎3倍!
vonjd

我只是使用as.numeric()将其转换为数字。工作完美。谢谢!
Abhishek Singh

46

我发现上面的Ken Williams帖子很棒,我添加了几行来说明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)))])
}

我发现可以加快速度,请参见下面的答案。
丹·霍顿,

33

估计并相信以下连续函数是一种快速而肮脏的方法,用于估计您认为来自连续单变量分布(例如正态分布)的数字向量的模式:

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

3
只是对此的一个注释:您可以通过这种方式获得任何一组连续数字的“模式”。数据不需要来自正态分布即可工作。这是从均匀分布中提取数字的示例。set.seed(1); a<-runif(100); mode<-density(a)$x[which.max(density(a)$y)]; abline(v=mode)
2014年

error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
塞尔吉奥

@xhie该错误消息告诉您所有您需要了解的内容。如果只有一点,则在通话时需要手动设置带宽density。但是,如果您只有一个数据点,那么无论如何该模式都可能是您对该数据的最佳猜测……
RasmusBååth16

没错,但我只做了一个调整:estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } } 我正在测试估计主要方向风的方法,而不是使用带有圆形包装的矢量平均值的方向平均值。我正在处理多边形坡度上的点,因此,有时只有一个带方向的点。谢谢!
塞尔吉奥

@xhie听起来很合理:)
RasmusBååth16年

14

以下功能分为三种形式:

method =“ mode” [默认值]:计算单峰向量的模式,否则返回NA
method =“ nmodes”:计算向量中模式的数目
method =“ modes”:列出单峰或多峰的所有模式向量

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()
}

在对此功能的描述中,您交换了“ modes”和“ nmodes”。参见代码。实际上,“ nmodes”返回值的向量,“ modes”返回模式数。毫无疑问,您的功能是找到到目前为止我所看到的模式的最好的灵魂。
Grzegorz Adam Adam Kowalski 2014年

非常感谢您的评论。现在,“ nmode”和“ modes”的行为应符合预期。
克里斯(Chris)

您的函数几乎可以正常工作,除非每个值使用均会频繁出现method = 'modes'。然后,该函数返回所有唯一值,但是实际上没有模式,因此应该返回NA。我将添加另一个答案,其中包含您的函数的稍微优化的版本,感谢您的启发!
hugovdberg'6

非空数值向量通常仅应在多峰向量上使用默认方法时,才应使用此函数生成NA。简单的数字序列(例如1,2,3,4)的模式实际上是该序列中的所有这些数字,因此对于类似的序列,“模式”的行为符合预期。例如,modeave(c(1,2,3,4),method =“ modes”)返回[1] 1 2 3 4不管如何,我会对功能进行优化感到非常感兴趣,因为该功能在其当前状态
克里斯

有关此功能的更有效版本,请参见上面的@hugovdberg帖子:)
Chris

10

在这里,另一个解决方案:

freq <- tapply(mySamples,mySamples,length)
#or freq <- table(mySamples)
as.numeric(names(freq)[which.max(freq)])

您可以将第一行替换为表格。

我以为“ tapply”比“ table”更有效,但是它们都使用for循环。我认为表的解决方案是等效的。我更新答案。
teucer 2010年

9

我目前无法投票,但RasmusBååth的答案是我一直在寻找。但是,我将对其进行一些修改,以限制分布,例如仅在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)]
}

我们知道您可能不想限制所有发行版,然后从=-“ BIG NUMBER”设置为=“ BIG NUMBER”


error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
塞尔吉奥

x应该是一个向量
AleRuete

8

对Ken Williams答案的小修改,添加了可选参数na.rmreturn_multiple

与答案所依赖的不同names(),此答案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])
}

为了显示它与可选参数一起使用并维护数据类型:

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"

感谢@Frank的简化。


7

我编写了以下代码以生成模式。

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)

6

基于@Chris的函数来计算模式或相关指标,但是使用Ken Williams的方法来计算频率。这为根本没有模式(所有元素都同样频繁)的情况提供了一种解决方法,并且提供了一些更易读的method名称。

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'")
}

由于它使用Ken的方法来计算频率,因此性能也得到了优化,我使用AkselA的帖子对以前的一些答案进行了基准测试,以表明我的功能在性能上与Ken的性能非常接近,而各种输出选项的条件仅导致较小的开销: 模式功能比较


您提供的代码或多或少Modepracma软件包中找到的功能的直接副本。介意解释吗?
AkselA

真?显然,我并不是唯一一个认为这是计算Mode的好方法的人,但是老实说,我不知道(以前从未知道过该软件包)。我整理了Chris的功能,并利用Ken的版本对其进行了改进,如果它类似于纯粹是巧合的其他人的代码,则对此进行了改进。
hugovdberg '16

我刚刚调查了一下,但是pracma您指的是哪个版本的软件包?据我所知,版本1.9.3具有完全不同的实现。
hugovdberg '16

2
对功能的尼斯修正。经过进一步的阅读,我得出的结论是,关于均匀分布还是单频分布是否具有节点尚无共识,一些消息来源称模式列表是分布本身,而另一些人则说没有节点。唯一的共识是,为此类分布生成模式列表既不是非常有用,也不是特别有意义。如果您希望上面的函数产生这种情况下的模式,然后删除该行:nmodes <-ifelse(nmodes == n,0L,nmodes)
克里斯(Chris

1
@greendiod对不起,我错过了您的评论。可以通过以下要点获得:gist.github.com/Hugovdberg/0f00444d46efd99ed27bbe227bdc4d37
hugovdberg

6

这个技巧应该可以正常工作。为您提供值以及模式数:

Mode <- function(x){
a = table(x) # x is a vector
return(a[which.max(a)])
}

3

R有这么多的附加程序包,以至于其中的一些程序包可以很好地提供数字列表/系列/矢量的[统计]模式。

但是,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

对于更大的样本列表,应该考虑为max(tabSmpl)值使用一个临时变量(我不知道R会自动对此进行优化)

参考:请参阅“中位数和众数如何?” 在本KickStarting R课程中,
这似乎可以确认(至少在撰写本课程时)R中没有模式函数(嗯... mode(),您发现该模式函数用于声明变量的类型) )。


3

这个工作很好

> a<-c(1,1,2,2,3,3,4,4,5)
> names(table(a))[table(a)==max(table(a))]

3

这是查找模式的函数:

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)
}

3

以下是可用于查找R中向量变量的模式的代码。

a <- table([vector])

names(a[a==max(a)])

3

为此提供了多种解决方案。我检查了第一个,然后写了我自己的。如果可以帮助任何人,请在此处发布:

Mode <- function(x){
  y <- data.frame(table(x))
  y[y$Freq == max(y$Freq),1]
}

让我们用几个例子进行测试。我正在获取iris数据集。让我们用数字数据进行测试

> Mode(iris$Sepal.Length)
[1] 5

您可以验证的是正确的。

现在,虹膜数据集(种类)中唯一的非数字字段没有模式。让我们用我们自己的例子进行测试

> 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))
}

函数的最后一行只是将最终模式值强制为原始输入的类型。


这将返回一个因子,而用户可能希望保留输入的类型。也许要增加一个中间步骤y[,1] <- sort(unique(x))
Frank

2

我将使用density()函数来识别(可能是连续的)分布的平滑最大值:

function(x) density(x, 2)$x[density(x, 2)$y == max(density(x, 2)$y)]

其中x是数据收集。注意用于调节平滑度的密度函数的调整参数。


2

尽管我喜欢Ken Williams的简单功能,但我想检索多种模式(如果存在)。考虑到这一点,我使用以下函数,该函数返回多个模式或单个模式的列表。

rmode <- function(x) {
  x <- sort(x)  
  u <- unique(x)
  y <- lapply(u, function(y) length(x[x==y]))
  u[which( unlist(y) == max(unlist(y)) )]
} 

如果它总是返回一个列表(如果只有一种模式,则长度为1),则对于编程使用将更加一致
asac 2016年

这是一个正确的观点@ antoine-sac。我喜欢这种解决方案的是,返回的向量使答案易于确定。只需解决函数的输出:r <-m​​ode(c(2,2,3,3))即可使用r [1]和r [2]上可用的模式。不过,您的观点确实很不错!!
RandallShanePhD

准确地说,这就是您的解决方案不足的地方。如果mode返回包含多个值的列表,则r [1]不是第一个值;相反,它是一个包含第一个值的长度为1的列表,您必须执行r [[1]]才能将第一个模式作为数字而不是列表。现在,当存在单一模式时,您的r不是列表,因此r [1]有效,这就是为什么我认为它不一致的原因。但是由于r [[1]]在r是简单向量时也可以工作,因此实际上并没有实现一致性,因为您可以始终使用它[[来访问元素。
asac 2013年

2

我一直在研究所有这些选项,并开始怀疑它们的相对功能和性能,因此我进行了一些测试。如果其他人对此感到好奇,我在这里分享我的结果。

我不想打扰这里发布的所有功能,而是选择了基于一些条件的样本:该功能应同时适用于字符,因子,逻辑和数字矢量,应适当处理NA和其他问题值,并且输出应该是“明智的”,即没有数字作为字符或其他此类愚蠢的东西。

我还添加了自己的功能,该功能基于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。函数名称引用其各自的作者:

在此处输入图片说明

克里斯的功能设置为method="modes"na.rm=TRUE默认情况下使其具有更高的可比性,但除此之外,作者所使用的功能也不同。

仅在速度方面,Kens版本就可以轻松取胜,但这也是其中仅有的一种,无论实际有多少种,它只会报告一种模式。通常,速度和多功能性之间需要权衡取舍。在method="mode",如果存在一种模式,则克里斯的版本将返回值,否则为NA。我认为这很不错。我还认为有趣的是,某些功能如何受到越来越多的唯一值的影响,而其他功能却没有那么多。除了消除逻辑/数字成因外,我还没有详细研究代码来找出原因。


2

模式并非在每种情况下都有用。因此,该功能应解决这种情况。尝试以下功能。

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."

抱歉,我只是看不到如何将新内容添加到已发布的内容中。另外,您的输出似乎与上面的功能不一致。
not2qubit

2

这是基于jprockbelly的答案的,它为非常短的向量增加了速度。在将模式应用于具有许多小型组的data.frame或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)))]
}


1

另一个可能的解决方案:

Mode <- function(x) {
    if (is.numeric(x)) {
        x_table <- table(x)
        return(as.numeric(names(x_table)[which.max(x_table)]))
    }
}

用法:

set.seed(100)
v <- sample(x = 1:100, size = 1000000, replace = TRUE)
system.time(Mode(v))

输出:

   user  system elapsed 
   0.32    0.00    0.31 

1

我假设您的观察是实数,并且当观察为2、2、3 和3时,您期望模式为2.5,那么您可以估计以下模式,其中l1 ..下限最常见类f1。最常见的类,的。频率f0的最频繁的前级的类..frequency,F2最频繁的后级的类..frequency和 ..Class间隔给出例如,在123mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)

#Small Example
x <- c(2,2,3,3) #Observations
i <- 1          #Class interval

z <- hist(x, breaks = seq(min(x)-1.5*i, max(x)+1.5*i, i), plot=F) #Calculate frequency of classes
mf <- which.max(z$counts)   #index of most frequent class
zc <- z$counts
z$breaks[mf] + i * (zc[mf] - zc[mf-1]) / (2*zc[mf] - zc[mf-1] - zc[mf+1])  #gives you the mode of 2.5


#Larger Example
set.seed(0)
i <- 5          #Class interval
x <- round(rnorm(100,mean=100,sd=10)/i)*i #Observations

z <- hist(x, breaks = seq(min(x)-1.5*i, max(x)+1.5*i, i), plot=F)
mf <- which.max(z$counts)
zc <- z$counts
z$breaks[mf] + i * (zc[mf] - zc[mf-1]) / (2*zc[mf] - zc[mf-1] - zc[mf+1])  #gives you the mode of 99.5

如果您想要最频繁的级别并且您拥有多个最频繁的级别,则可以使用以下方法获得所有这些级别:

x <- c(2,2,3,5,5)
names(which(max(table(x))==table(x)))
#"2" "5"

1

添加可能的data.table方法

library(data.table)
#for single mode
dtmode <- function(x) x[which.max(data.table::rowid(x))]

#for multiple modes
dtmodes <- function(x) x[{r <- rowid(x); r==max(r)}]

1

您可以在Theta(N)运行时执行以下几种操作

from collections import defaultdict

def mode1(L):
    counts = defaultdict(int)
    for v in L:
        counts[v] += 1
    return max(counts,key=lambda x:counts[x])
def mode2(L):
    vals = set(L)
    return max(vals,key=lambda x: L.count(x))
def mode3(L):
    return max(set(L), key=lambda x: L.count(x))

0

可以尝试以下功能:

  1. 将数值转换为因数
  2. 使用summary()获取频率表
  3. 返回模式频率最大的索引
  4. 即使有1种以上的模式,也可以将系数转换回数字,此功能效果很好!
mode <- function(x){
  y <- as.factor(x)
  freq <- summary(y)
  mode <- names(freq)[freq[names(freq)] == max(freq)]
  as.numeric(mode)
}

0

计算模式主要是在因素变量的情况下,那么我们可以使用

labels(table(HouseVotes84$V1)[as.numeric(labels(max(table(HouseVotes84$V1))))])

HouseVotes84是在“ mlbench”包中可用的数据集。

它将给出最大标签值。内置函数本身更容易使用,而无需编写函数。


0

在我看来,如果集合具有模式,则可以将其元素与自然数一一对应。因此,查找模式的问题减少到生成此类映射,查找映射值的模式,然后映射回集合中的某些项目的问题。(处理NA在映射阶段发生)。

我有一个histogram在相似的主体上运行的函数。(此处提供的代码中使用的特殊功能和运算符应在Shapiro和/或neatOveRse中定义。此处复制的Shapiro和neatOveRse的部分经许可可以复制;复制的摘录可以在本网站的条款下使用。 )R 伪代码histogramIS

.histogram <- function (i)
        if (i %|% is.empty) integer() else
        vapply2(i %|% max %|% seqN, `==` %<=% i %O% sum)

histogram <- function(i) i %|% rmna %|% .histogram

(特殊的二进制运算符完成管道curryingcomposition)我也有一个maxloc函数,该函数类似于which.max,但是返回向量的所有绝对最大值。[R 伪代码maxlocIS

FUNloc <- function (FUN, x, na.rm=F)
        which(x == list(identity, rmna)[[na.rm %|% index.b]](x) %|% FUN)

maxloc <- FUNloc %<=% max

minloc <- FUNloc %<=% min # I'M THROWING IN minloc TO EXPLAIN WHY I MADE FUNloc

然后

imode <- histogram %O% maxloc

x %|% map %|% imode %|% unmap

如果定义了适当的map-ping和unmap-ping函数,它将计算任何集合的模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.