在dplyr::summarise中使用group_size分组运算报错,如何解决?
解决dplyr分组计算占比的问题
嘿,你的思路完全没问题,只是在获取组大小的时候用错了工具!你遇到的报错是因为group_size(.)的用法和dplyr在summarise中的上下文不匹配——虽然.指向的是分组后的tbl,但group_size更适合用来批量获取所有组的大小,而非在单个组的计算逻辑里调用。
其实dplyr专门为这个场景提供了更简洁的函数:n()。在分组后的summarise代码块里,n()会自动返回当前组的行数(也就是组的大小),完美适配你的需求。
正确的代码应该是这样:
mtcars %>% group_by(cyl) %>% summarise(manual_ratio = sum(am) / n())
运行这段代码后,你会得到每个cyl组里手动挡车辆的占比:
# A tibble: 3 × 2 cyl manual_ratio <dbl> <dbl> 1 4 0.727 2 6 0.429 3 8 0.143
要是你好奇为什么原来的方法行不通,补充说明下:group_size(.)会返回所有组的大小组成的向量,而在summarise的每一组计算中,你需要的是单个组的大小,n()正好做了这件事——它在每个组的上下文中只返回当前组的行数,所以计算起来更直接。
内容的提问来源于stack exchange,提问作者Scransom
相关产品推荐
相关产品推荐

