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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:09:04