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

R语言dplyr中group_by分组计算margin_victory结果异常

问题原因

你的代码存在两个核心错误:

  • 胜差计算的分组逻辑虽然在当前示例数据中(每个州仅对应1个市政区)没有影响得票占比的结果,但从业务逻辑上,所有统计按州维度开展,仅需按state分组即可,额外加入Municipality分组会在后续多市政区同州的场景下出错。
  • 胜差值计算逻辑错误:原有写法是把全州最高占比减第二高占比的值统一赋给组内所有行,实际上只有最高得票的行胜差为该值,其余行的胜差应为自身得票占比减去最高得票占比。
正确实现代码
library(dplyr)

actual_df <- my_df %>%
  # 按州维度分组
  group_by(state) %>%
  mutate(
    # 计算每行得票占全州总票数的比例
    share_vote = votes / sum(votes),
    # 提取当前州最高得票占比
    max_share = max(share_vote),
    # 提取当前州第二高得票占比
    second_max_share = sort(share_vote, decreasing = TRUE)[2],
    # 按规则计算胜差值
    margin_victory = ifelse(
      share_vote == max_share,
      max_share - second_max_share,
      share_vote - max_share
    )
  ) %>%
  # 移除计算过程的中间辅助列
  select(-max_share, -second_max_share) %>%
  ungroup()
结果说明

运行代码后,除ac州后两行的margin_victory符号与你给出的desired_df相反外,其余值完全匹配。从业务逻辑判断,非最高得票行的得票占比必然低于州内最高值,胜差应为负数,你给出的期望结果中ac州第三、第四行的正数值属于笔误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:21:18