修复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
相关产品推荐
相关产品推荐

