如何基于分组统计结果生成各ATT_ID的CAR='B'占比表?
问题描述
我用以下代码生成了第一张统计表格:
JH %>% group_by(ATT_ID, CAR=="B") %>% summarize(count = n(), .groups = "drop")
生成的表格如下:
| ATT_ID | CAR == "B" | Count |
|---|---|---|
| ONE | FALSE | 1 |
| TWO | TRUE | 1 |
| THREE | TRUE | 3 |
| THREE | FALSE | 5 |
| FOUR | FALSE | 2 |
| FIVE | TRUE | 4 |
| SIX | TRUE | 8 |
| SIX | FALSE | 4 |
我希望将其转换为以下格式的表格,计算每个ATT_ID对应的CAR="B"的占比:
| ATT_ID | Percentage of "B" |
|---|---|
| ONE | 0% |
| TWO | 100% |
| THREE | 37.5% |
| FOUR | 0% |
| FIVE | 100% |
| SIX | 67% |
注:部分ATT_ID同时存在FALSE和TRUE的统计行,部分仅存在其中一种,需要准确计算每个分组的占比。请问该如何实现?
解决方案
不需要先按CAR=="B"分组统计再二次处理,直接基于原数据JH按ATT_ID分组,一步就能完成占比计算与格式化:
JH %>% group_by(ATT_ID) %>% summarize( `Percentage of "B"` = scales::percent(mean(CAR == "B"), accuracy = 0.1) ) %>% ungroup()
代码说明:
mean(CAR == "B"):布尔值TRUE会被识别为1,FALSE识别为0,取均值直接得到CAR="B"的占比scales::percent():将数值转换为百分比格式,accuracy=0.1用于保留一位小数;如果需要像示例中SIX那样取整数,把参数改成accuracy=1即可- 若不想依赖
scales包,可手动计算格式化:
JH %>% group_by(ATT_ID) %>% summarize( `Percentage of "B"` = paste0(round(mean(CAR == "B") * 100, 1), "%") ) %>% ungroup()
如果已经生成了第一张统计表格(假设命名为summary_df),也可以基于它计算:
summary_df %>% group_by(ATT_ID) %>% summarize( `Percentage of "B"` = scales::percent(sum(Count[`CAR == "B"`]) / sum(Count), accuracy = 0.1) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

