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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:30:19