R语言DataFrame按VARIAVEL根值(第二个下划线前)与TYPE聚合计算占比
嘿,这就帮你把这个R语言DataFrame的占比计算需求搞定!结合你已经开始用stringr提取根变量的思路,咱们用dplyr配合来完成整个流程,步骤清晰又实用:
完整实现步骤
1. 提取VARIAVEL的根值字段
首先咱们要把VARIAVEL里第二个下划线之前的内容提取出来作为根变量,这里有两种稳妥的方法:
方法一:用正则表达式快速匹配
用stringr的str_extract函数,正则^[^_]+_[^_]+可以精准匹配从开头到第二个下划线的内容:
library(dplyr) library(stringr) # 假设你的原始数据框名为df df <- df %>% mutate(root_var = str_extract(VARIAVEL, "^[^_]+_[^_]+"))
方法二:拆分后拼接(兼容特殊格式)
如果你的VARIAVEL存在少于两个下划线的特殊情况,用str_split拆分后取前两个元素再拼接会更稳妥:
df <- df %>% mutate(root_var = str_split(VARIAVEL, "_") %>% purrr::map_chr(~paste(.[1:2], collapse = "_")))
2. 分组计算占比
接下来按根变量(root_var)和TYPE分组,先计算每组的总VALOR,再用每行的VALOR除以组总计得到占比,还可以转成百分比格式:
# 如果需要百分比格式,先加载scales包 library(scales) df_with_ratio <- df %>% group_by(root_var, TYPE) %>% mutate( # 计算每组的VALOR总和,忽略缺失值 group_total = sum(VALOR, na.rm = TRUE), # 计算占比(小数形式) valor_ratio = VALOR / group_total, # 转成带一位小数的百分比字符串,和你示例的51.1%一致 valor_percent = percent(valor_ratio, accuracy = 0.1) ) %>% ungroup()
示例验证
拿你提到的例子测试一下,假设原始数据是这样的:
# 示例测试数据 df <- tibble( VARIAVEL = c("CLI_RELAC_01", "CLI_RELAC_02", "OPER_RELAC_01", "OPER_RELAC_02"), TYPE = c("A", "A", "B", "B"), VALOR = c(450, 430, 200, 300) )
运行代码后,CLI_RELAC+TYPE=A组的总计是880,450对应的占比就是450/880≈51.1%,完全符合你的需求~
小提示
- 如果不需要百分比字符串,只保留小数占比的话,删掉
valor_percent那一行即可 - 如果有缺失值,
na.rm = TRUE能保证分组总和计算不会出错
内容的提问来源于stack exchange,提问作者Nizam
相关产品推荐
相关产品推荐

