【问题标题】:Get most frequently occurring factor level in dplyr piping structure获取 dplyr 管道结构中最常出现的因子级别
【发布时间】:2018-07-18 22:57:54
【问题描述】:

我希望能够在使用 dplyr 的管道结构时找到数据集中某个因子中出现频率最高的级别。当被另一个变量分组时,我正在尝试创建一个包含“模态”因子级别的新变量。

这是我正在寻找的示例:

df <- data.frame(cat = stringi::stri_rand_strings(100, 1, '[A-Z]'), num = floor(runif(100, min=0, max=500)))
df <- df %>%
            dplyr::group_by(cat) %>%
            dplyr::mutate(cat_mode = Mode(num))

“模式”是我正在寻找的功能

【问题讨论】:

  • 模式确定很困难,而且问题多多,当数据不是完全单峰时会加剧。您是在寻找数学模式(带平滑)还是最常出现的模式?
  • 我正在寻找最频繁出现的具有很少级别的分类变量 (7)
  • 如果 Psidom 的回答不够好​​,如果您提供此示例数据的预期结果,将会有所帮助。由于您使用的是随机数据,因此您需要使用 set.seed 修改您的问题以使其可重现。
  • 如果您的变量已经是factor,您也许可以利用forcats::fct_infreq()

标签: r dplyr


【解决方案1】:

使用table 统计项目,然后使用which.max 找出最频繁的一项:

df %>%
    group_by(cat) %>%
    mutate(cat_mode = names(which.max(table(num)))) %>% 
    head()

# A tibble: 6 x 3
# Groups: cat [4]
#  cat      num cat_mode
#  <fctr> <dbl> <chr>   
#1 Q      305   138     
#2 W       34.0 212     
#3 R       53.0 53      
#4 D      395   5       
#5 W      212   212     
#6 Q      417   138  
# ...

【讨论】:

    【解决方案2】:

    Is there a built-in function for finding the mode?类似的问题

    Mode <- function(x) {
      ux <- unique(x)
      ux[which.max(tabulate(match(x, ux)))]
    }
    
    df %>% 
      group_by(cat) %>% 
      mutate(cat_mode = Mode(num))
    
    # A tibble: 100 x 3
    # Groups:   cat [26]
       cat     num cat_mode
       <fct> <dbl>    <dbl>
     1 S        25       25
     2 V        86      478
     3 R       335      335
     4 S       288       25
     5 S       330       25
     6 Q       384      384
     7 C       313      313
     8 H       275      275
     9 K       274      274
    10 J        75       75
    # ... with 90 more rows
    

    查看每个因素

    df %>% 
      group_by(cat) %>% 
      summarise(cat_mode = Mode(num))
    
     A tibble: 26 x 2
       cat   cat_mode
       <fct>    <dbl>
     1 A          480
     2 B          380
     3 C          313
     4 D          253
     5 E          202
     6 F           52
     7 G          182
     8 H          275
     9 I          356
    10 J           75
    # ... with 16 more rows
    

    【讨论】:

    • 谢谢。您知道如何修改众数公式以排除因子的某一水平(“未知”)吗?
    • 您可以在应用模式功能和分组之前将其过滤掉吗?
    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2012-12-17
    • 2020-03-07
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多