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
相关产品推荐
相关产品推荐

