使用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
相关产品推荐
相关产品推荐

