如何在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) )
错误原因
if()是标量条件判断函数,只能接受长度为1的条件,但rank=="2"是长度为4的向量,因此触发the condition has length >1报错。- 原代码试图在逐行运算的
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
相关产品推荐
相关产品推荐

