【问题标题】:Using Dplyr "group_by" and "Summarise" and a Custom Function to Calculate the Mode of Several Groups使用 Dplyr "group_by" 和 "Summarise" 以及自定义函数来计算多个组的众数
【发布时间】:2016-07-05 13:33:09
【问题描述】:

显然 dplyr 的汇总功能不包括“模式”选项。根据下面的简单数据框示例,我想确定每组“类别”的模式或最频繁重复的数字。所以对于“A”组,模式是22,对于“B”,是12和14,“C”没有重复的数字。

我在网上找到了一些函数示例,但没有一个解决组中没有重复数字的情况。是否需要自定义功能,或者某处是否有模式选项?我不想仅仅为了它们的模式功能而依赖任何其他专门的包。使用 base R、dplyr、tidy 等的组合找到一个优雅而简单的解决方案会很好。

如果使用自定义函数,则它必须在没有重复数字以及有多个相同重复数字时工作。

任何帮助将不胜感激!这似乎应该是 R 中一个简单的解决方案,所以我很惊讶地发现没有简单的 summarise_each(funs(mode)... 选项。

如果使用了自定义函数,请分解并解释。我对 R 函数还是比较陌生。

Category<-c("A","B","B","C","A","A","A","B","C","B","C","C")
Number<-c(22,12,12,8,22,22,18,14,10,14,1,3)
DF<-data.frame(Category,Number)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用

     Mode <- function(x) {
      ux <- unique(x)
      if(!anyDuplicated(x)){
          NA_character_ } else { 
         tbl <-   tabulate(match(x, ux))
         toString(ux[tbl==max(tbl)])
     }
    }
    
    DF %>%
       group_by(Category) %>%
       summarise(NumberMode = Mode(Number))
    #  Category NumberMode
    #    <fctr>      <chr>
    #1        A         22
    #2        B     12, 14
    #3        C       <NA>
    

    【讨论】:

    • 感谢您的快速回复。我之前尝试过这个函数,但是对于没有任何重复数字的组“C”,它返回一个 8。没有办法返回一些东西来指示没有重复数字吗?此外,组“B”有两个数字,每个数字重复两次,所以我想它默认返回最小的数字。如果有多个模式,有没有办法返回两个数字?这可能要求太多了......但如果可能的话,我真的很想知道什么时候没有重复的数字......
    • @Mike C组你想要什么?
    • 太好了,正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2019-11-27
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多