r语言 - 计算模式或第二/第三/第四最常见的值



肯定有一个函数在那里的一些包?

我已经搜索过了,我已经找到了这个函数来计算模式:

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

但是我想要一个函数,可以让我轻松地计算数据列中第二/第三/第四/第n个最常见的值。

最终我将把这个函数应用于大量的dplyr::group_by()

谢谢你的帮助!

也许你可以试试

f <- function (x) with(rle(sort(x)), values[order(lengths, decreasing = TRUE)])

这给出了按频率递减排序的唯一向量值。第一个是模式,第二个是第二常见的,等等。

另一个方法是基于table():

g <- function (x) as.numeric(names(sort(table(x), decreasing = TRUE)))

但不建议这样做,因为输入向量x将被强制首先因子化。如果你有一个很大的向量,这是非常慢的。同样,在退出时,我们必须提取表的字符名和字符名,并将其强制转换为数字。


set.seed(0); x <- rpois(100, 10)
f(x)
# [1] 11 12  7  9  8 13 10 14  5 15  6  2  3 16

table中的列联表比较:

tab <- sort(table(x), decreasing = TRUE)
# 11 12  7  9  8 13 10 14  5 15  6  2  3 16 
# 14 14 11 11 10 10  9  7  5  4  2  1  1  1
as.numeric(names(tab))
# [1] 11 12  7  9  8 13 10 14  5 15  6  2  3 16

所以结果是一样的

这是我做的一个R函数(受到其他几个SO帖子的启发),它可能适合您的目标(我使用宗教信仰的本地数据集来说明它):

很简单;仅涉及R基函数:length, match, sort, tabulate, table, unique,其中,作为字符。

    Find_Nth_Mode = function(d, N = 2) {
      maxN = function(x, N){
        len = length(x)
        if(N>len){
          warning('N greater than length(x).  Setting N=length(x)')
          N = length(x)
        }
        sort(x,partial=len-N+1)[len-N+1]
      }
      
      (ux = unique(as.character(d)))
      (match(d, ux))
      (a1 = tabulate(match(d, ux)))
      (a2 = maxN(a1, N))
      (a3 = which(a1 == a2))
      (ux[a3])
    }

> table(religion_data$relig11)
                   0.None 1.Protestant_Conservative      2.Protestant_Liberal                3.Catholic 
                    34486                      6134                     19678                     36880 
               4.Orthodox             5.Islam_Sunni              6.Islam_Shia                   7.Hindu 
                    20702                     28170                       668                      4653 
               8.Buddhism                  9.Jewish                  10.Other 
                     9983                       381                      6851 
> Find_Nth_Mode(religion_data$relig11, 1)
[1] "3.Catholic"
> Find_Nth_Mode(religion_data$relig11, 2)
[1] "0.None"
> Find_Nth_Mode(religion_data$relig11, 3)
[1] "5.Islam_Sunni"

参考:我要感谢这些帖子,从中我得到了这两个功能,并将它们合二为一:

  • 函数查找第N个最大值:查找向量或列中第二(第三…)最高/最低值的最快方法

  • 如何找到第二大模式值?计算模式或第二/第三/第四最常见的值

最新更新