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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:42:12