我想要计算我的数据集的模式值(由其他因素分割,因此每个组都有自己的模式值,如果有所不同,我可能会使用dplyr)。我发现this question讨论了定位 a 模态值的函数。
问题是,上面指出的代码只返回第一个模态值,因此返回的值会根据数据集的顺序而变化。我想要创建两个函数,专注于多模态分布中的最高和最低模式。
例如,在向量
中x <- c(4.0, 1.0, 2.2, 2.2, 2.2, 4.0, 0.3, 4.0)
我希望minmode(x)
返回2.2
,maxmode(x)
返回4.0
。任何人都可以向我解释如何调整上面链接的代码(或创建一个新函数)吗?
答案 0 :(得分:1)
您似乎想要range
最常见的值。使用整洁的方法,我会这样解决。
library(dplyr)
mode_range <- function(df, x) {
require(dplyr, quietly = TRUE)
var <- quo(x)
val <- df %>%
group_by(!!var) %>%
summarise(n = n()) %>%
filter(n == max(n)) %>%
select(!!var) %>%
unlist
range(val)
}
df <- tibble(x = c(4.0, 1.0, 2.2, 2.2, 2.2, 4.0, 0.3, 4.0))
mode_range(df, x)[1] # min value
# [1] 2.2
mode_range(df, x)[2] # max value
# [1] 4
答案 1 :(得分:1)
基础R中的另一种方法是修改你链接的代码(digEmAll对接受的答案的建议):
Mode <- function(x) {
ux <- unique(x)
tab <- tabulate(match(x, ux))
ux[tab == max(tab)]
}
这将返回所有模式,然后您可以将其用于minmode(x)或maxmode(x):
x <- c(4.0, 1.0, 2.2, 2.2, 2.2, 4.0, 0.3, 4.0)
min(Mode(x))
# [1] 2.2
max(Mode(x))
# [1] 4