计算众数或第 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
所以结果是一样的
肯定必须在某些包中有一个功能吗?
我搜索了一下,找到了这个计算众数的函数:
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
所以结果是一样的