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

求助:在R中基于指定百分比批量计算price、count和profit的方法

R中实现数据集运算的解决方案

问题说明

现有两个数据集:

  • d1:原始状态下仅perc=100时存在price和count值,其余为NA
  • d2:包含按mdm分组的弹性系数elast和成本cost

需要完成以下运算:

  1. 按mdm分组,以perc=100的price为基准,按perc值调整所有行的price:perc<100时减去对应百分比,perc>100时增加对应百分比
  2. 按mdm分组,以perc=100的count为基准,结合d2的elast计算所有行的count:count基准值 + (100-perc)*elast
  3. 按mdm分组,用公式(price - d2的cost值)*count计算profit列

数据集定义

原始状态的d1(模拟)

# 模拟原始d1:仅perc=100有price和count值,其余为NA
d1 <- structure(list(
  mdm = c(7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L),
  perc = c(50L,60L,70L,80L,85L,90L,95L,96L,97L,98L,99L,100L,101L,102L,103L,104L,105L,110L,115L,120L,130L,140L,150L,50L,60L,70L,80L,85L,90L,95L,96L,97L,98L,99L,100L,101L,102L,103L,104L,105L,110L,115L,120L,130L,140L,150L),
  price = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,77.8,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,77.8,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
  count = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,100,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,100,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
), class = "data.frame", row.names = c(NA,-46L))

d2数据集

d2 <- structure(list(
  mdm = 7:8, 
  elast = c(1.5,1.5), 
  cost = 24:25
), class = "data.frame", row.names = c(NA,-2L))

实现代码

使用dplyr包完成分组运算,代码如下:

library(dplyr)

d1_processed <- d1 %>%
  # 按mdm分组
  group_by(mdm) %>%
  # 合并d2的elast和cost到分组中
  left_join(d2, by = "mdm") %>%
  # 计算price列:以perc=100的price为基准调整
  mutate(
    price = case_when(
      !is.na(price) ~ price,
      TRUE ~ price[perc == 100] * (perc / 100)
    ),
    # 计算count列:基准count + (100-perc)*elast
    count = case_when(
      !is.na(count) ~ count,
      TRUE ~ count[perc == 100] + (100 - perc) * elast
    ),
    # 计算profit列:(price - cost)*count
    profit = (price - cost) * count
  ) %>%
  # 移除临时合并的elast和cost列(可选)
  select(-elast, -cost) %>%
  # 取消分组
  ungroup()

# 查看结果
head(d1_processed)

代码解释

  1. 分组与合并:group_by(mdm)按mdm分组,left_join(d2, by = "mdm")把d2的弹性系数和成本关联到对应分组
  2. price计算:利用perc/100直接计算比例,比如perc=99就是0.99倍基准price,perc=101就是1.01倍,无需分条件判断增减,更简洁
  3. count计算:取分组内perc=100的count作为基准值,代入公式计算所有行的count
  4. profit计算:直接用调整后的price减去对应分组的cost,再乘以count得到利润
  5. 清理与取消分组:移除不需要的临时列,取消分组方便后续操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:17