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

如何在R中基于类别权重实现总额向子类别按比例分配?

问题解决:按区域总额分配到子类别行(三率法)

错误原因

你之前的代码问题出在分组逻辑:group_by(region, Country, Employee)会把每个员工组内的数值求和作为分母,但实际上总额是区域(region)级别的,应该以整个区域下的V1/V2/V3总和作为分母计算占比。

正确实现代码

library(dplyr)

df1 <- data.frame(region = c("a","a","a","a","a","a","a"),
                  Country = c("ax","ax","ax","ay","ay","az","az"),
                  Employee = c("axa","axc","axc","aya","ayb","aza","azc"),
                  V1 = c(10,10,10,15,12,18,19),
                  V2 = c(20,20,15,13,17,20,18),
                  V3 = c(8,9,10,12,15,30,10))

df2 <- data.frame (territory= c("a","b","c","d"),
                   total = c(2000,1000,5000,3000))

df_calc <- df1 %>% 
  left_join(df2, by = c("region" = "territory")) %>%
  # 仅按region分组,计算区域内各V列的总和
  group_by(region) %>%
  mutate(
    # 对V1-V3列,计算分配值:总额 * 该行值 / 区域内该列总和
    across(V1:V3, ~ total * . / sum(.), .names = "{.col}_allocation")
  ) %>%
  ungroup()

# 查看结果
print(df_calc)

逻辑说明

  • 关联两个数据框后,按region分组,确保分母是整个区域下对应V列的总和
  • across(V1:V3, ...)批量处理所有需要分配的列,.names参数自动生成带_allocation后缀的新列
  • 最终每行的分配值 = 区域总额 × 该行V值 / 区域内该V列的总和,完全符合三率法的分配逻辑

内容的提问来源于stack exchange,提问作者Denis Do

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:54:25