R语言dataframe计算列占比、格式化数值并重命名列的实现方法
dplyr 管道实现全流程数据处理
可直接运行的示例数据构造
原示例代码存在闭合括号缺失问题,修正后可直接复现匹配的数据集:
df <- structure( list( Grade = c("Grade 1", "Grade 2", "Grade 3", "Grade 4", "Grade 5", "Total"), n_each.x = c(76, 48, 20, 4, 2, 150), n_each.y = c(16, 17, 8, 2, 0, 43) ), class = "data.frame", row.names = c(NA, -6L) )
单段管道实现代码
无需逐行对列名赋值,所有操作在dplyr管道链路内完成,严格匹配占比计算、格式规则、列重命名要求:
library(dplyr) # 匹配格式规则的辅助函数:整数直接显示,非整数保留两位小数 fmt_ratio <- function(x) { dplyr::if_else( abs(x - round(x)) < 1e-6, # 规避浮点精度误差的整数判断 as.character(round(x)), sprintf("%.2f", round(x, 2)) ) } # 管道实现全流程操作 res <- df %>% transmute( Grade = Grade, `Test 1` = n_each.x / n_each.x[6] %>% fmt_ratio(), `Test 2` = n_each.y / n_each.y[6] %>% fmt_ratio() )
规则匹配说明
- 占比计算逻辑:每列元素直接除以本列第6行(Total行)的合计值,和手动编写的
.x/.x[6]逻辑完全等价 - 格式化规则:
- 整数值(如Total行计算得到的1.0、Grade5行Test2列的0.0)直接显示为整数形式,无多余的.00后缀
- 非整数值自动四舍五入保留两位小数,类似1.236的数值会处理为1.24格式
- 列重命名:在构造新列时直接指定目标列名(带空格的列名用反引号包裹),无需单独执行列名赋值操作
运行输出结果
Grade Test 1 Test 2 1 Grade 1 0.51 0.37 2 Grade 2 0.32 0.40 3 Grade 3 0.13 0.19 4 Grade 4 0.03 0.05 5 Grade 5 0.01 0 6 Total 1 1
若需要输出带%后缀的百分比格式,仅需将占比计算公式调整为
n_each.x / n_each.x[6] * 100,并在格式化函数内追加%拼接逻辑即可,整体管道结构无需改动。
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

