求助:在R中基于指定百分比批量计算price、count和profit的方法
R中实现数据集运算的解决方案
问题说明
现有两个数据集:
d1:原始状态下仅perc=100时存在price和count值,其余为NAd2:包含按mdm分组的弹性系数elast和成本cost
需要完成以下运算:
- 按
mdm分组,以perc=100的price为基准,按perc值调整所有行的price:perc<100时减去对应百分比,perc>100时增加对应百分比 - 按
mdm分组,以perc=100的count为基准,结合d2的elast计算所有行的count:count基准值 + (100-perc)*elast - 按
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)
代码解释
- 分组与合并:
group_by(mdm)按mdm分组,left_join(d2, by = "mdm")把d2的弹性系数和成本关联到对应分组 - price计算:利用
perc/100直接计算比例,比如perc=99就是0.99倍基准price,perc=101就是1.01倍,无需分条件判断增减,更简洁 - count计算:取分组内
perc=100的count作为基准值,代入公式计算所有行的count - profit计算:直接用调整后的price减去对应分组的cost,再乘以count得到利润
- 清理与取消分组:移除不需要的临时列,取消分组方便后续操作
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

