dplyr group_by与summarise仅2017年选举数据分组汇总失效
排查思路
首先排查最低级也最容易踩的代码书写问题:
- 你贴出的代码里,第一行filter语句末尾的管道符被注释了:
dplyr::filter(Election == 2017 & WKR_NR <= 299) #%>%。如果跑2017年数据时你没删掉这个注释符,后面的group_by、summarise、filter步骤根本不是接在筛选结果后运行的,而是直接作用于全量原始数据,结果必然不符合预期。其他年份运行正常大概率是你改筛选条件时顺手把注释去掉了。
快速验证方法:单独运行第一行筛选代码,检查输出结果的行数、Election列取值是否符合预期,再确认输出对象有没有携带正确的分组属性。
排除注释问题后,按以下优先级排查:
- 校验2017年数据的字段格式和内容一致性
- 对比2013、2017年数据集的
WKR_NR/Partei/Stimmen/Total_Erststimmen四个字段的类型,重点确认:Partei列是否存在多余首尾空格、全角半角字符混用、同政党名大小写不一致的问题,这类问题会导致同一个政党被识别成多个独立分组Stimmen/Total_Erststimmen是否被读成字符类型,导致得票率计算时出现隐式转换错误Total_Erststimmen列是否存在0值、NA值,导致计算出的得票率出现Inf、NaN,干扰max()的判断逻辑
- 检查重复值:统计2017年数据中同一
WKR_NR+Partei组合是否存在多条记录,重复记录会导致汇总计算结果偏差
- 对比2013、2017年数据集的
- 排查函数冲突和分组逻辑问题
- 确认运行环境是否同时加载了plyr包,plyr的summarise会覆盖dplyr的同名函数,导致分组逻辑完全失效。稳妥做法是所有dplyr函数都显式加
dplyr::前缀调用,避免命名空间冲突 - 跑完summarise步骤后,运行
dplyr::group_vars(结果对象)查看当前分组状态:如果使用的dplyr版本较旧,summarise不会自动剥离最后一层分组(即仍按WKR_NR+Partei双字段分组),后续filter计算max时每个分组只有一行数据,等于完全没做筛选。这种情况可以在summarise后显式加一行dplyr::group_by(WKR_NR),再做最大值筛选即可。
- 确认运行环境是否同时加载了plyr包,plyr的summarise会覆盖dplyr的同名函数,导致分组逻辑完全失效。稳妥做法是所有dplyr函数都显式加
更稳定的改写方案
不要依赖summarise的自动分组剥离特性,把逻辑写得更明确,兼容不同dplyr版本,也避免手动匹配最大值的疏漏:
election <- elec_df %>% dplyr::filter(Election == 2017 & WKR_NR <= 299) %>% dplyr::group_by(WKR_NR, Partei) %>% dplyr::summarise( Anteil_Stimmen = sum(Stimmen, na.rm = TRUE)/max(Total_Erststimmen, na.rm = TRUE), .groups = "drop_last" # 显式指定汇总后保留WKR_NR单字段分组,消除版本差异影响 ) %>% # 直接取每个选区内得票率最高的行,不用手动写max匹配逻辑 dplyr::slice_max(order_by = Anteil_Stimmen, n = 1, with_ties = FALSE)
内容的提问来源于stack exchange,提问作者peanutbutterandjellyfish
相关产品推荐
相关产品推荐

