如何在R中按组计算系数乘积及原始值占比并更新数据
R语言实现指定数据运算的最优简便方法
原始数据集
数据集s
s <- structure(list(month_id = c(202306L, 202305L, 202307L, 202305L, 202306L, 202307L), MDM_Key = c(1L, 1L, 1L, 2L, 2L, 2L), sale_count = c(NA, 19161L, NA, 17726L, NA, NA), iek_max_discount = c(0.5356, 0.5256, 0.5456, 0.559, 0.569, 0.589)), class = "data.frame", row.names = c(NA, -6L))
系数数据集cf
cf <- structure(list(MDM_Key = 1:2, ML.coef = c(1.46, 1.67)), class = "data.frame", row.names = c(NA, -2L))
运算需求
注:
iek_max_discount为小数形式的百分比值(如0.5356实际代表53.56%)
- 按
MDM_Key分组,将cf中对应组的ML.coef与s中对应组非当前月份的iek_max_discount(转换为百分比后)相乘,得到percent; - 以当前月(示例为202305)的
sale_count为基准,计算prop = sale_count * percent / 100; - 将
prop与当前月sale_count相加得到final,填充至对应非当前月份的记录中。
示例处理结果(MDM_Key=1)
month_id MDM_Key sale_count iek_max_discount percent prop final 202306 1 0,5356 78 14945 34106 202305 1 19161 0,5256 202307 1 0,5456 79 15137 34298
最优简便实现方法
使用dplyr包的管道式操作可以高效完成分组、关联、计算全流程,代码如下:
library(dplyr) # 定义当前月份 current_month <- 202305 result <- s %>% # 关联系数数据集 left_join(cf, by = "MDM_Key") %>% # 按MDM_Key分组处理 group_by(MDM_Key) %>% # 提取当前月的sale_count作为基准值 mutate(base_sale = first(sale_count[month_id == current_month])) %>% # 计算各字段:percent为系数*折扣百分比,prop为基准销量*percent/100,final为基准+prop mutate( percent = round(iek_max_discount * 100 * ML.coef), # 按示例取整 prop = round(base_sale * percent / 100), final = base_sale + prop ) %>% # 仅保留当前月对应的sale_count,非当前月的sale_count仍为NA mutate(sale_count = ifelse(month_id == current_month, sale_count, NA)) %>% # 取消分组 ungroup() %>% # 调整列顺序,匹配示例格式 select(month_id, MDM_Key, sale_count, iek_max_discount, percent, prop, final) # 查看结果 print(result)
代码说明
left_join:将系数表与主表按MDM_Key关联,确保每个分组能拿到对应的ML.coef;group_by(MDM_Key):按分组处理每个MDM_Key的计算逻辑;base_sale:提取当前月的sale_count作为基准值,每个分组内统一使用该值;- 字段计算:按照需求依次算出
percent、prop、final,其中round()是为了匹配示例中的整数结果; - 最后调整列顺序,让输出格式与示例一致。
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

