使用janitor::adorn_percentages()时如何排除总计行列的百分比
用janitor包无需stringr实现交叉表Total行/列移除百分比
在处理mtcars数据集生成交叉汇总表时,我们可以不依赖stringr包的字符串替换,仅通过janitor包结合dplyr的基础函数,实现Total行和Total列只保留纯数值、其余单元格保留「数值 (百分比)」格式的效果:
library(janitor) library(dplyr) # 生成目标格式的交叉表 final_table <- mtcars %>% # 生成基础交叉频数表 tabyl(am, cyl) %>% # 添加Total行(各列总和)和Total列(各行总数) adorn_totals(c("row", "col")) %>% # 对非Total行的各列,拼接数值与百分比;Total行直接保留数值 mutate( across(-c(am, Total), ~if_else(am != "Total", paste0(., " (", adorn_pct_formatting(./Total, digits = 2), ")"), as.character(.))), # Total列仅保留纯数值 Total = as.character(Total) ) final_table
运行后输出结果:
am 4 6 8 Total 0 3 (15.79%) 4 (21.05%) 12 (63.16%) 19 1 8 (61.54%) 3 (23.08%) 2 (15.38%) 13 Total 11 7 14 32
实现逻辑说明
- 先用
tabyl()生成基础频数表,再通过adorn_totals()添加Total行和列的纯数值; - 用
mutate()结合across()遍历非Total、非am的列:- 对非Total行的单元格,用
adorn_pct_formatting()计算并格式化行百分比,再与原数值拼接成「数值 (百分比)」格式; - Total行的单元格直接保留原数值并转为字符型;
- 对非Total行的单元格,用
- 单独将Total列转为纯数值字符型,完成格式调整。
内容的提问来源于stack exchange,提问作者Mathica
相关产品推荐
相关产品推荐

