R语言使用dplyr多字段分组后计算各组数值占比的实现方法
问题原因
你的代码存在两处逻辑偏差:
- 分组规则错误:你需要以每个
var1分组的总value作为占比分母,因此不需要将var2加入分组条件 - 操作函数错误:
summarise()会将分组后的数据聚合压缩,每个分组仅保留一行结果,会丢失原始行信息,你需要使用mutate()为每一行新增占比字段。
实现代码
方案1:输出数值型占比
library(dplyr) result <- data %>% group_by(var1) %>% # 仅按var1分组,自动计算每个var1组的总value mutate(prop = value / sum(value)) %>% ungroup()
运行后prop列就是你需要的数值格式占比。
方案2:输出你示例中的分数格式
需要调用MASS包的fractions()函数实现分数格式化,同时按你给出的示例输出调整id和排序:
library(dplyr) library(MASS) result_frac <- data %>% group_by(var1) %>% mutate(value = as.character(fractions(value / sum(value)))) %>% ungroup() %>% arrange(var1, var2) %>% # 按var1、var2排序匹配你的预期输出 select(-id) %>% mutate(id = paste0("ID", row_number())) %>% # 生成新的连续id select(id, var1, var2, value)
运行后result_frac的结构和内容与你给出的预期输出完全一致。
特殊场景适配
如果你的原始数据中存在同一个var1+var2组合对应多条记录,可以先聚合再计算占比:
data %>% group_by(var1, var2) %>% summarise(value_sum = sum(value), .groups = "drop_last") %>% # 聚合后仅保留var1分组 mutate(prop = value_sum / sum(value_sum)) %>% ungroup()
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

