肯定有一个函数在那里的一些包?
我已经搜索过了,我已经找到了这个函数来计算模式:
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个最大值:查找向量或列中第二(第三…)最高/最低值的最快方法
如何找到第二大模式值?计算模式或第二/第三/第四最常见的值