You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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组合是否存在多条记录,重复记录会导致汇总计算结果偏差
  • 排查函数冲突和分组逻辑问题
    • 确认运行环境是否同时加载了plyr包,plyr的summarise会覆盖dplyr的同名函数,导致分组逻辑完全失效。稳妥做法是所有dplyr函数都显式加dplyr::前缀调用,避免命名空间冲突
    • 跑完summarise步骤后,运行dplyr::group_vars(结果对象)查看当前分组状态:如果使用的dplyr版本较旧,summarise不会自动剥离最后一层分组(即仍按WKR_NR+Partei双字段分组),后续filter计算max时每个分组只有一行数据,等于完全没做筛选。这种情况可以在summarise后显式加一行dplyr::group_by(WKR_NR),再做最大值筛选即可。
更稳定的改写方案

不要依赖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 23:42:28