R语言非互斥分组过滤后列汇总重复代码优化方案问询
优化方案
两种实现方式都可以避免重复写统计逻辑,同时适配你提到的非互斥过滤条件的场景:
方法1:批量执行过滤逻辑(最简洁,维护成本低)
把所有过滤规则统一存为列表,通过map_dfr批量执行汇总并自动按行合并:
library(tidyverse) # 自定义过滤规则,命名对应不同分组 filter_rules <- list( block1 = ~ filter(.x, not_covered_poor <= 0), block2 = ~ filter(.x, beneficiaries >= 1), block3 = ~ filter(.x, beneficiaries == 0) ) # 批量汇总合并,自动生成分组标识列 result <- map_dfr(filter_rules, ~ .x(df) %>% summarise( parrishes = n(), avg_org_count = mean(org_count), percent_poor = sum(pop_poor) / sum(population), percent_urban = sum(pop_urban) / sum(population) ), .id = "group")
你后续如果需要新增过滤条件,只需要在filter_rules里加一项即可,不需要修改汇总逻辑。
方法2:单次扫描数据集(最高效,适合大数据量)
不用多次过滤数据集,仅扫描一次原数据即可完成所有分组统计:
library(tidyverse) result <- df %>% # 标记每条记录所属的分组(支持同时属于多个分组) mutate( block1 = not_covered_poor <= 0, block2 = beneficiaries >= 1, block3 = beneficiaries == 0 ) %>% # 转为长表格式 pivot_longer(cols = starts_with("block"), names_to = "group", values_to = "in_group") %>% filter(in_group) %>% # 按分组统一汇总 group_by(group) %>% summarise( parrishes = n(), avg_org_count = mean(org_count), percent_poor = sum(pop_poor) / sum(population), percent_urban = sum(pop_urban) / sum(population) )
两种方法的输出结果和你原有代码的rbind结果完全一致,同时多了group列方便区分不同分组的统计值。
内容的提问来源于stack exchange,提问作者Sentient_Slime_Mold
相关产品推荐
相关产品推荐

