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

如何在dplyr::mutate中指定多条件计算选举胜差变量?

问题:计算法国议会选举数据集的胜差变量(mv)

需求:创建名为胜差(mv)的新变量:

  • 当政党排名为第一名(rank=="1")时,mv = 该政党得票率(voteshare) - 第二名(rank=="2")的得票率
  • 当政党非第一名(rank==2:4)时,mv = 该政党得票率 - 第一名的得票率

尝试的错误代码:

data<-data.frame(
  party=c("party 1","party 2","party 3","party 4"),
  voteshare=c(0,52,10,38),
  rank=c(4,1,3,2)
)
library(tidyverse)
data<-mutate(
  data,
  mv=ifelse(rank=="1",
            (voteshare-if(rank=="2"){voteshare}),
            (voteshare-if(rank=="1"){voteshare}))
)

报错信息:

the condition has length > 1

即使将else部分设为0,第一名的mv仍为NA。期望输出:

data.frame(
  party=c("party 1","party 2","party 3","party 4"),
  voteshare=c(0,52,10,38),
  rank=c(4,1,3,2),
  mv=c(-52,14,-42,-14)
)

错误原因

  1. if()是标量条件判断函数,只能接受长度为1的条件,但rank=="2"是长度为4的向量,因此触发the condition has length >1报错。
  2. 原代码试图在逐行运算的ifelse中直接提取其他行的排名对应值,逻辑错误——逐行判断时无法跨行获取第二名/第一名的得票率,导致结果为NA。

正确解决方案

先提取整个数据集中第一名和第二名的得票率(标量值),再通过ifelse逐行计算胜差:

data <- data.frame(
  party=c("party 1","party 2","party 3","party 4"),
  voteshare=c(0,52,10,38),
  rank=c(4,1,3,2)
)

library(tidyverse)

# 提取第一名、第二名的得票率
first_vote <- data %>% filter(rank == "1") %>% pull(voteshare)
second_vote <- data %>% filter(rank == "2") %>% pull(voteshare)

# 计算胜差变量mv
data <- data %>%
  mutate(
    mv = ifelse(
      rank == "1",
      voteshare - second_vote,
      voteshare - first_vote
    )
  )

# 查看结果
print(data)

运行后输出与期望一致:

party voteshare rank  mv
1 party 1         0    4 -52
2 party 2        52    1  14
3 party 3        10    3 -42
4 party 4        38    2 -14

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:10