Mode()众数
在 R 语言中,没有内置函数直接计算众数(mode),因为众数不像均值或中位数那样是基本的统计量。众数是数据集中出现次数最多的值。但是,你可以用几种方法来计算众数。
单个众数的情况¶
一种简单的方法是使用 table()
函数来构建频率表(因子类型???),然后使用 which.max()
函数找到最大值对应的索引,像这样:
1,推荐
names(which.max(table(data_q1$viewers))
d <- c(4,5,3,1,6,7,8,9,11,12,32,1,3,4,5,5)
table(d) # 生成频率表,带有向量名和对应频率值
which.max(table(d)) # 上面是名称5,下面最大频率对应的索引值4
names(which.max(table(d))) # 取名称
names(table(d))
d <- c(2,1,3,4,5,6,7,8,9,0,11,12,32,1,3,4)
table(d) # 生成频率表,带有向量名和对应频率值
which.max(table(d)) # 上面是名称1,下面最大频率对应的索引值2
names(which.max(table(d)))
names(table(d))
2,
# 定义一个计算众数的函数
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
# 创建一个示例向量
x <- c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4)
# 调用自定义的众数函数
mode_value <- Mode(x)
print(mode_value)
如果你有 dplyr
包安装,也可以使用 dplyr
的功能来计算众数,例如:
library(dplyr)
# 使用 dplyr 计算众数
mode_value <- x %>%
as.data.frame() %>%
group_by(value = x) %>%
summarise(count = n()) %>%
arrange(desc(count)) %>%
slice(1) %>%
pull(value)
print(mode_value)
请注意,如果数据中有多个众数(也就是说,有多个值拥有相同的最高频率),上述两种方法都只会返回其中一个。如果你想要返回所有众数,需要对函数进行修改,以便它能够处理这种情况。
多个众数的情况¶
在存在多个众数的情况下,你可以通过编写一个自定义的 R 函数来找出所有的众数。这个函数将使用 table()
函数来创建一个频率表,并找出所有出现频率最高的值。这里有一个简单的函数定义示例:
Mode <- function(x) {
freq_table <- table(x)
mode_values <- names(freq_table[freq_table == max(freq_table)])
as.numeric(mode_values)
}
# 创建一个含有多个众数的向量
x <- c(1, 1, 2, 2, 3, 3, 4)
# 调用自定义的众数函数
mode_values <- Mode(x)
print(mode_values)
## 输出
# [1, 2, 3]
在这个函数中:
table(x)
计算向量x
中每个值的出现频率。freq_table == max(freq_table)
找出所有出现频率等于最大频率的值。names()
获取这些频率值的名称,这些名称实际上就是向量x
中的值。as.numeric()
将结果转换为数值类型,因为table()
函数的结果会返回因子类型的名称。
当你运行这个函数时,它会返回向量中所有的众数。如果有多个值出现频率相同且都是最高的,那么这些值都将被返回。
或直接在df上进行操作:
# the function for computing mode
mode <- df_bbt %>%
group_by(Viewers..millions.) %>%
summarise(count = n()) %>%
slice_max(count, with_ties = TRUE)
# the mean, median, and mode
cat(paste0("the mean of viewers:", round(mean(df_bbt$Viewers..millions.),2), "\n",
"the median of viewers:", median(df_bbt$Viewers..millions.), "\n"))
cat("the mode of viewers:", mode$Viewers..millions.)