在R中,mean()和median()是标准函数,它们执行您所期望的功能。Mode()告诉您对象的内部存储模式,而不是参数中出现次数最多的值。但是是否存在一个标准库函数来实现向量(或列表)的统计模式?
当前回答
效果很好
> a<-c(1,1,2,2,3,3,4,4,5)
> names(table(a))[table(a)==max(table(a))]
其他回答
我发现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)))])
}
还有一个解决方案,适用于数字和字符/因子数据:
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)]
}
模式并不是在所有情况下都有用。所以函数应该处理这种情况。试试下面的函数。
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."
添加raster::modal()作为一个选项,不过请注意,raster是一个很大的包,如果不做地理空间方面的工作,可能不值得安装。
源代码可以从https://github.com/rspatial/raster/blob/master/src/modal.cpp和https://github.com/rspatial/raster/blob/master/R/modal.R中取出,放入个人R包中,供那些特别热衷的人使用。
计算模式大多是在有因素变量的情况下才可以使用
labels(table(HouseVotes84$V1)[as.numeric(labels(max(table(HouseVotes84$V1))))])
HouseVotes84是在“mlbench”包中可用的数据集。
它会给出最大标签值。它更容易由内置函数本身使用,而无需编写函数。
推荐文章
- 当我的ggplot2语法合理时,我如何处理R CMD检查“全局变量无可见绑定”注释?
- 如何将表转换为数据帧
- 转换data.frame列到向量?
- 如何将颜色分配给ggplot2中具有稳定映射的类别变量?
- 在基础图形的绘图区域之外绘制一个图例?
- 在ggplot2中的各个facet上注释文本
- 确定数据帧列的数据类型
- 删除重复的行
- 将行名转换为第一列
- 如何在R脚本中抑制全局警告
- data.frame中每组的平均值
- 准确理解什么时候数据。Table是对另一个data.table的引用(而不是副本)
- 在R函数中指定可选参数的“正确”方法
- 如何在R中选择CRAN镜像
- 用Python计算Pearson相关性和显著性