计算众数或第 2/3/4 最常见值

Calculating the mode or 2nd/3rd/4th most common value

肯定必须在某些包中有一个功能吗?

我搜索了一下,找到了这个计算众数的函数:

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

但我想要一个函数,它可以让我轻松计算一列数据中第 2/3/4/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 将首先被强制分解为因子。如果你有一个大向量,这会很慢。同样在退出时,我们必须提取字符名称和 table 并将其强制转换为数字。


例子

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 的偶然事件 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

所以结果是一样的