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

R语言按水果、进口国分组后仅对重复行按权重占比重算金额字段

要实现仅对分组内重复行按占比重算金额字段的需求,核心逻辑是先判断当前行的Price、Extra_Fee、Total三个字段的组合在所属Fruit+Import_country分组内是否重复,仅对出现次数大于1的重复组合执行重算,非重复组合直接保留原值即可。

修改后代码(基础写法,兼容所有dplyr版本)

result <- data %>%
  # 按Fruit+Import_country大分组计算每行重量占比
  group_by(Fruit, Import_country) %>%
  mutate(proportion = Weight / sum(Weight)) %>%
  # 按三个金额字段二次分组,统计每个组合的出现次数
  group_by(Fruit, Import_country, Price, Extra_Fee, Total) %>%
  mutate(
    Price_new = ifelse(n() > 1, Price * proportion, Price),
    Extra_Fee_new = ifelse(n() > 1, Extra_Fee * proportion, Extra_Fee),
    Total_new = ifelse(n() > 1, Total * proportion, Total)
  ) %>%
  ungroup() %>%
  # 可按需删除旧字段和占比字段
  select(-Price, -Extra_Fee, -Total, -proportion)

简化写法(dplyr 1.0及以上版本,支持批量处理字段)

result <- data %>%
  group_by(Fruit, Import_country) %>%
  mutate(proportion = Weight / sum(Weight)) %>%
  group_by(Fruit, Import_country, Price, Extra_Fee, Total) %>%
  # 批量对三个金额字段做判断重算,自动生成带_new后缀的新字段
  mutate(
    across(c(Price, Extra_Fee, Total),
           ~ifelse(n() > 1, .x * proportion, .x),
           .names = "{.col}_new")
  ) %>%
  ungroup() %>%
  select(-Price, -Extra_Fee, -Total, -proportion)

效果验证

以示例数据中的Apple+India分组为例:

  • Fiodi对应的Price=4.5、Extra_Fee=2.2、Total=20组合仅出现1次,因此新字段保留原值
  • Rodny和Clare对应的Price=2.3、Extra_Fee=1.1、Total=6组合出现2次,会按各自重量占比折算金额

内容的提问来源于stack exchange,提问作者me.limes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:54:05