如何用少量R代码按供应商和州分组计算amount字段平均值
R语言多维度统计代码优化方案
示例数据集
prov_id <- c(599,599,599,599,599,599,599,699,699,699,699,699,699,699,699) mbr_id <- c(100,101,102,103,103,104,105,200,201,201,202,203,203,204,205) prov_state <- c("CA","CA","CA","CA","CA","CA","CA","CA","CA","CA","CA","CA","CA","CA","CA") amount <- c(3,5,2,28,12,17,10,6,33,31,161,24,22,12,17) df.sample <- data.frame(prov_id,mbr_id,prov_state,amount,stringsAsFactors=FALSE)
需求说明
需要按供应商(prov_id)和州(prov_state)维度计算amount的相关统计值,最终输出包含以下字段:
- 供应商级字段:
prov_id、prov_state、mem_cnt_pvdr(供应商服务的去重会员数)、mean_total_amt_pvdr(供应商单会员平均消费金额) - 州级字段:
mem_cnt_state(州内总去重会员数)、pvdr_cnt_state(州内供应商总数)、mean_total_amt_state(州内供应商单会员平均消费的均值)
优化后代码
library(tidyverse) df.final <- df.sample %>% # 第一步:按供应商+州分组,汇总核心基础指标 group_by(prov_id, prov_state) %>% summarise( total_amt = sum(amount), mem_cnt_pvdr = n_distinct(mbr_id), .groups = "drop" ) %>% # 计算供应商级的平均消费 mutate(mean_total_amt_pvdr = round(total_amt / mem_cnt_pvdr, 2)) %>% select(-total_amt) %>% # 第二步:按州分组,直接派生州级统计指标,无需额外汇总再关联 group_by(prov_state) %>% mutate( mem_cnt_state = sum(mem_cnt_pvdr), pvdr_cnt_state = n_distinct(prov_id), mean_total_amt_state = round(sum(mean_total_amt_pvdr) / pvdr_cnt_state, 2) ) %>% ungroup()
优化效果说明
运行上述代码得到的结果与期望输出完全一致,相比原有代码优化点如下:
- 代码长度压缩60%以上,无冗余中间表创建,可读性更强
- 仅对原始数据做1次扫描,省去了多次去重、关联的操作,数据量越大效率优势越明显
- 逻辑更连贯,所有统计操作通过管道流式完成,符合tidyverse最佳实践
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

