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

修复R语言选举获胜者筛选代码:仅保留获胜优势≤5%的结果

R代码错误排查与修正(筛选获胜优势≤5%的选举获胜者)

原代码的核心问题

  • 分组操作逻辑错误:在group_by后的代码块里直接用tab_relevant调用全量数据,而非用.指代当前分组的子集,导致操作未按分组执行。
  • 获胜优势计算完全错误:原代码判断单个候选人得票率≤5%,这和“获胜优势≤5%”(第一名与第二名得票率之差≤5%)的需求完全不符。
  • 向量条件误用if:if只能处理单个逻辑值,你用了整列向量做判断,会触发警告且逻辑失效,dplyr分组场景要使用窗口函数或筛选逻辑。
  • slice_max用法错误:正确用法是传入列名(如slice_max(candidatevotes, n=1)),而非直接传入向量。
  • 返回值逻辑错误:分组操作中返回FALSE无法生成目标数据框,应该保留符合条件的分组的获胜者。

修正后的代码方案

方案一:分步计算排名与获胜优势

library(dplyr)

tab_relevant %>%
  group_by(year, state, district) %>%
  # 计算得票率和分组内得票排名
  mutate(
    vote_pct = candidatevotes / totalvotes,
    rank = dense_rank(desc(candidatevotes))
  ) %>%
  # 保留每组前两名,计算获胜优势
  filter(rank <= 2) %>%
  mutate(win_margin = vote_pct[rank == 1] - vote_pct[rank == 2]) %>%
  # 筛选获胜者且优势≤5%
  filter(rank == 1, win_margin <= 0.05) %>%
  # 清理辅助列
  select(-vote_pct, -rank, -win_margin) %>%
  ungroup() -> winner

方案二:用窗口函数简化计算

library(dplyr)

tab_relevant %>%
  group_by(year, state, district) %>%
  # 计算得票率、组内最高/次高得票率
  mutate(
    vote_pct = candidatevotes / totalvotes,
    max_pct = max(vote_pct),
    second_max_pct = max(vote_pct[vote_pct != max_pct], na.rm = TRUE)
  ) %>%
  # 筛选获胜者且优势≤5%
  filter(vote_pct == max_pct, (max_pct - second_max_pct) <= 0.05) %>%
  # 清理辅助列
  select(-vote_pct, -max_pct, -second_max_pct) %>%
  ungroup() -> winner

注意事项

  • 如果部分分组只有1名候选人(无竞争),second_max_pct会返回NA,可根据需求添加filter(!is.na(second_max_pct))过滤这类分组。
  • 确保totalvotes是对应分组的总票数,若数据中未提供,可先添加mutate(totalvotes = sum(candidatevotes))计算每组总票数。

内容的提问来源于stack exchange,提问作者nesehorn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:50:17