使用Dplyr" group_by"和"总结"和一个自定义函数来计算几个组的模式

时间:2016-07-05 03:20:14

标签: r dplyr

显然,dplyr的总结功能并未包含"模式"的选项。基于下面的简单数据框示例,我想确定每组"类别的模式或最常重复的数字。"因此对于组" A",模式是22,对于" B",它的12和14,并且没有重复的数字用于" C&#34 ;。

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

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

任何帮助将不胜感激!这似乎应该是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)

1 个答案:

答案 0 :(得分:4)

我们可以使用

 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>