R语言如何通过日期区间与政党匹配为df1生成执政虚拟变量
实现方案
前提准备
首先确保所有日期字段为日期格式,避免字符串匹配出错:
- R语言可通过
as.Date()转换 - Python可通过
pd.to_datetime()转换
R语言实现(推荐data.table方案,高效处理十万级以上数据)
# 加载依赖包 library(data.table) # 转换为data.table格式,同时统一日期格式 setDT(df1) setDT(df2) df1[, date := as.Date(date)] df2[, `:=`(start_date = as.Date(start_date), end_date = as.Date(end_date))] # 按政党+日期区间匹配,直接在df1中生成执政虚拟变量is_ruling df1[, is_ruling := df2[df1, on = .(party, start_date <= date, end_date >= date), x.values]]
如果习惯使用tidyverse生态,可使用fuzzyjoin实现:
library(tidyverse) library(fuzzyjoin) # 统一日期格式 df1 <- df1 %>% mutate(date = as.Date(date)) df2 <- df2 %>% mutate(start_date = as.Date(start_date), end_date = as.Date(end_date)) # 区间左连接 df_result <- interval_left_join( df1, df2, by = c("party" = "party", "date" = "start_date", "date" = "end_date"), match_fun = list(`==`, `>=`, `<=`) )
最终输出的values或is_ruling字段就是需要的执政标识,1为执政,0为在野。
Python实现(pandas方案)
方法1:小数据量场景
import pandas as pd # 统一日期格式 df1['date'] = pd.to_datetime(df1['date']) df2['start_date'] = pd.to_datetime(df2['start_date']) df2['end_date'] = pd.to_datetime(df2['end_date']) # 先按政党合并,再过滤符合日期区间的记录 df_merged = df1.merge(df2, on='party', how='left') df_result = df_merged[(df_merged['date'] >= df_merged['start_date']) & (df_merged['date'] <= df_merged['end_date'])] # 去重保留原df1的所有行 df_result = df_result.drop_duplicates(subset=df1.columns).reset_index(drop=True)
方法2:大数据量场景(效率更高)
# 先按政党和日期排序 df1 = df1.sort_values(['party', 'date']).reset_index(drop=True) df2 = df2.sort_values(['party', 'start_date']).reset_index(drop=True) # 按政党分组匹配最近的执政起始日期 df_result = pd.merge_asof(df1, df2, by='party', left_on='date', right_on='start_date') # 过滤掉超出执政结束日期的记录 df_result = df_result[df_result['date'] <= df_result['end_date']].reset_index(drop=True)
注意事项
- 请根据df2的区间定义调整匹配逻辑:若区间为左闭右开,将
<= end_date改为< end_date即可。 - 若存在演讲记录匹配不到对应执政区间的情况,可按需将
values字段的缺失值填充为0或保留为NA。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

