R语言结合月度退款表计算交易DataFrame商品最终实付价格
解决方案
你可以直接使用tidyverse内置的dplyr和lubridate工具包完成计算,核心解决日期匹配问题的思路是将两张表的日期统一为同一种年月格式后再关联:
完整可运行代码
# 加载tidyverse(已内置lubridate、dplyr,无需额外安装) library(tidyverse) # ---------------------- # 第一步:解决日期匹配问题 # 给交易表新增和退款表格式完全一致的年月字段 transactions <- transactions %>% mutate(Month = format(Date, "%B %y")) # %B=月份全称 %y=两位年份,和退款表Month字段完全对齐 # ---------------------- # 第二步:统计每月各商品的总购买数量 monthly_purchase_cnt <- transactions %>% group_by(Month, Product) %>% summarise(purchase_cnt = n(), .groups = "drop") # ---------------------- # 第三步:关联退款表,计算单条交易对应的单位退款额 unit_refund <- refund %>% inner_join(monthly_purchase_cnt, by = c("Month", "Product")) %>% mutate(unit_refund = Amount / purchase_cnt) %>% select(Month, Product, unit_refund) # ---------------------- # 第四步:关联回原交易表,计算最终实付价格 final_df <- transactions %>% left_join(unit_refund, by = c("Month", "Product")) %>% mutate( # 无退款规则的商品(如冰淇淋)退款额默认为0 unit_refund = replace_na(unit_refund, 0), Final_Price = Price - unit_refund ) %>% # 清除计算过程的中间字段,保留原表结构+最终实付价 select(Product, Date, Price, Final_Price)
优化建议
如果实际业务中退款表的月份字符串格式存在不统一的问题,可以改用月份首日日期作为关联键,完全避免字符串匹配误差:
# 退款表转月份首日日期 refund_clean <- refund %>% mutate(month_start = lubridate::my(Month)) # 自动解析"December 20"这类字符串为当月首日日期 # 交易表转月份首日日期 transactions_clean <- transactions %>% mutate(month_start = lubridate::floor_date(Date, unit = "month")) # 后续关联时使用`month_start`和`Product`作为联合主键即可
运行上述代码得到的final_df和你提供的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

