模式优先级最小或最大

时间:2017-12-19 00:02:09

标签: r

我想要计算我的数据集的模式值(由其他因素分割,因此每个组都有自己的模式值,如果有所不同,我可能会使用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.2maxmode(x)返回4.0。任何人都可以向我解释如何调整上面链接的代码(或创建一个新函数)吗?

2 个答案:

答案 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
相关问题