You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dplyr计算多列占比并自定义输出列名的实现方案

dplyr计算行占比及自定义列名实现方案

核心需求对应解决方法

  • 自定义per_原列名格式的新列名:通过across函数的.names参数直接配置命名规则即可实现,不需要后续手动改列名
  • 无需提前计算行总和:可直接在占比计算逻辑中实时统计当前行的目标列总和,不需要额外生成存储中间total列

最优实现代码

写法1:直观易读版(适合小数据集)

基于rowwise + c_across实现,逻辑直白好理解:

library(dplyr)
# 示例数据
a <- structure(list(year = 2000:2005, Col1 = 1:6, Col2 = c(1L, 4L, 9L, 16L, 25L, 36L)), row.names = c(NA, -6L), class = "data.frame")

# 一步计算占比并生成指定格式列名
a <- a %>%
  rowwise() %>%
  mutate(across(starts_with("Col"), 
                ~ .x / sum(c_across(starts_with("Col")), na.rm = TRUE) * 100,
                .names = "per_{.col}")) %>%
  ungroup() # 完成计算后取消行分组,避免影响后续操作

写法2:高性能向量化版(适合大数据集)

基于rowSums + pick实现,运行效率远高于行分组写法,适合万行以上的数据集使用:

a <- a %>%
  mutate(across(starts_with("Col"),
                ~ .x / rowSums(pick(starts_with("Col")), na.rm = TRUE) * 100,
                .names = "per_{.col}"))

注意事项

上述语法依赖dplyr 1.0.0及以上版本,若运行报错可先执行install.packages("dplyr")升级包版本。

内容的提问来源于stack exchange,提问作者Masoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:39:03