R语言如何修改代码 为数据框新增各值除以列总和的占比列
实现方法
直接替换你原有代码即可,兼容你已经在使用的tidyverse语法,不需要安装额外包:
library(tidyverse) result <- dane %>% select(starts_with("P_2_")) %>% lapply(function(x) factor(x, levels = 1:8)) %>% lapply(tabulate) %>% # 生成你原本得到的基础计数表 data.frame() %>% # 新增第一列Odp,存1-8的水平序号 mutate(Odp = 1:8, .before = 1) %>% # 为每个计数列计算对应百分比占比 mutate(across( .cols = -Odp, .fns = list(pct = ~ round(.x / sum(.x) * 100, 2)) )) %>% # 调整列顺序,让每个计数列后紧跟对应的占比列 select(Odp, sort(rep(names(.)[-1], 2))) %>% # 去除占比列的后缀,和你要求的列名格式完全匹配 rename_with(~ gsub("_pct", "", .), ends_with("_pct"))
- 如果你需要0-1区间的比例值而非百分比,直接删掉代码里的
*100即可 - 小数保留位数可以修改
round()函数的第二个参数调整,比如保留1位小数就写round(.x / sum(.x) * 100, 1) - 旧版本tidyverse如果运行报错,不影响核心逻辑,只需要保证数据框转换步骤正常即可
运行后输出的结果数值、列顺序、列格式完全匹配你给出的目标表:第一列为Odp水平序号,每个原始计数列(整数型)后紧跟同列名的占比列(双精度型)。
内容的提问来源于stack exchange,提问作者Chmielu PL
相关产品推荐
相关产品推荐

