如何用R基于美国众议院选举历史结果创建incumbency变量?
解决方案:创建基于往届选举结果的在任变量
要实现你需要的i变量(标记参选政党是否为上一届该选区的获胜党),核心是关联当前年份与上一年份同选区的获胜政党,以下是两种可行的实现方式:
方法一:利用lag()直接在原数据集内处理
这种方法无需额外创建辅助表,直接通过分组和滞后函数关联上一年的结果:
library(tidyverse) # 你的模拟数据集 data <- data.frame( party=rep(1:2,100), district=rep(1:2,each=2,50), state=rep(1:2,each=4,25), year=rep(1:25,each=8) ) %>% mutate(voteshare=rnorm(200,mean=50,sd=10)) %>% group_by(year,state,district) %>% mutate(rank=dense_rank(desc(voteshare))) %>% # 开始生成i变量 group_by(state, district, year) %>% # 标记当前年份该选区的获胜政党 mutate(winning_party = ifelse(rank == 1, party, NA)) %>% # 按州-选区分组,提取上一年的获胜政党 group_by(state, district) %>% mutate(prev_winner = lag(winning_party)) %>% # 生成最终的i变量 mutate(i = case_when( year == 1 ~ NA_real_, # 首届选举无过往数据,赋值NA party == prev_winner ~ 1, # 当前政党是上届获胜党,赋值1 TRUE ~ 0 # 其余情况赋值0 )) %>% ungroup()
逻辑说明
- 先在
year-state-district分组内标记出当年的获胜政党; - 切换到
state-district分组后,用lag()将上一年的获胜政党值映射到当前年份的所有参选政党记录中; - 通过
case_when()完成最终的变量赋值,严格匹配你的需求。
方法二:创建辅助获胜党表后合并
这种方法逻辑更直观,先提取所有选区历年的获胜记录,再通过年份偏移合并到原数据集:
library(tidyverse) # 模拟数据集(同之前的代码) data <- data.frame( party=rep(1:2,100), district=rep(1:2,each=2,50), state=rep(1:2,each=4,25), year=rep(1:25,each=8) ) %>% mutate(voteshare=rnorm(200,mean=50,sd=10)) %>% group_by(year,state,district) %>% mutate(rank=dense_rank(desc(voteshare))) %>% ungroup() # 第一步:提取每个州-选区-年份的获胜政党,并将年份+1(用于匹配下一年的参选记录) winner_table <- data %>% filter(rank == 1) %>% select(state, district, year, prev_winning_party = party) %>% mutate(year = year + 1) # 第二步:合并到原数据集并生成i变量 data <- data %>% left_join(winner_table, by = c("state", "district", "year")) %>% mutate(i = case_when( year == 1 ~ NA_real_, party == prev_winning_party ~ 1, TRUE ~ 0 ))
逻辑说明
- 先筛选出所有年份的获胜政党记录,将年份加1后,该表的
year字段正好对应原数据中需要匹配上届结果的年份; - 通过
left_join将上届获胜党信息关联到每个参选政党的记录中; - 最后用
case_when()完成变量赋值,结果与方法一完全一致。
内容的提问来源于stack exchange,提问作者Nicholas Ray
相关产品推荐
相关产品推荐

