You need to enable JavaScript to run this app. R语言dataframe计算列占比、格式化数值并重命名列的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 00:36:07