如何在R中基于报纸关停日期标记市政选举的处理状态
整合报纸关停信息至市政选举数据集
背景
需要将报纸关停记录整合到多省份市政选举数据集中,为选举数据新增closure(关停日期)和treated(标记该选举是否发生在报纸关停后)列,已知关停日期均落在对应省份两次选举之间。
现有数据集构建代码
市政选举数据集
library(dplyr) ab_elections <- seq.Date(from=as.Date("2001-10-01"), to=as.Date("2015-10-01"), by="4 years") bc_elections <- seq.Date(from=as.Date("2001-09-15"), to=as.Date("2018-10-01"), by="3 years") on_elections <- seq.Date(from=as.Date("2001-11-15"), to=as.Date("2019-10-01"), by="4 years") # 转换为数据框 abdf <- data.frame(province=c("AB"), election_date=ab_elections) bcdf <- data.frame(province=c("BC"), election_date=bc_elections) ondf <- data.frame(province=c("ON"), election_date=on_elections) # 合并行 abdf %>% bind_rows(bcdf) %>% bind_rows(ondf) -> df # 复制生成多个市镇的选举数据 purrr::map_dfr(seq_len(20), ~df) %>% arrange(province) -> df # 添加市镇、候选人数和市镇ID df %>% arrange(province, election_date) %>% mutate(municipality=sample(c("Town A", "Town B", "Town C", "Town D", "Town E", "Town F"), replace=T, size=nrow(df))) -> df df %>% arrange(province, municipality, election_date) %>% distinct() %>% mutate(n_candidates=sample(c(2:6), size=nrow(.), replace=T)) %>% mutate(municipality_id=paste(province, municipality, sep="_")) -> df glimpse(df)
报纸关停数据集
df %>% slice_sample(n=10) %>% select(-c(n_candidates, election_date)) %>% mutate(closure=sample(seq.Date(from=as.Date("2001-01-01"), to=as.Date("2018-12-31"), by="weeks"), size=10)) -> closures glimpse(closures)
解决方案
方法1:按municipality_id合并数据集并生成标记列
通过left_join将关停数据合并到选举数据中,然后判断选举日期是否晚于关停日期,生成treated列;对于没有关停记录的市镇,treated默认标记为FALSE:
# 合并数据集 df_merged <- df %>% left_join(closures, by = c("province", "municipality", "municipality_id")) %>% # 生成treated列:选举在关停后则为TRUE,否则FALSE(含无关停记录的情况) mutate( treated = case_when( !is.na(closure) & election_date > closure ~ TRUE, TRUE ~ FALSE ) ) glimpse(df_merged)
方法2:直接通过case_when结合匹配判断
如果不想合并数据集,也可以通过municipality_id匹配关停日期,再进行判断:
df_treated <- df %>% mutate( # 匹配对应市镇的关停日期 closure = closures$closure[match(municipality_id, closures$municipality_id)], # 标记是否为关停后选举 treated = !is.na(closure) & election_date > closure ) glimpse(df_treated)
两种方法都能实现需求,第一种更清晰直观,适合后续数据处理;第二种无需合并数据集,操作更简洁。
内容的提问来源于stack exchange,提问作者spindoctor
相关产品推荐
相关产品推荐

