使用Dplyr的"group_by"和"Summarise"以及自定义函数来计算多组的众数

6
显然,dplyr的summarise函数没有“mode”选项。基于下面简单的数据框示例,我想确定每个“Category”的众数或最常重复的数字。所以对于A组,众数是22,对于B组,它是12和14,对于C组则没有重复数字。
我在网上找到了一些函数示例,但没有涉及当组中没有重复数字的情况。是否需要自定义函数或者有mode选项存在?我不想仅仅为了他们的mode函数而依赖任何其他专业包。通过使用基础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个回答

5
我们可以使用
 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
1
@Mike,你想要C组的什么? - akrun
1
太好了,正是我想要的。谢谢! - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接