如何按new_regime划分区间计算变量均值(含NA值处理)
面板数据按政权区间计算变量均值并赋值的实现方法
核心需求是:针对每个个体的new_regime=1起始到下一个new_regime=1前的区间,计算variable的均值(忽略NA),并将该均值赋值给区间内所有年份的mean_variable字段。以下是两种常用数据分析工具的实现方案:
R语言实现(基于dplyr)
假设你的面板数据框名为panel_data,包含id(个体标识)、year(年份)、new_regime、variable字段,步骤如下:
- 先按个体和年份排序,保证时序逻辑正确
- 按个体分组,用
cumsum(new_regime)生成区间分组标识:每次new_regime=1时,分组ID会递增,同一政权区间的观测会共享同一个ID - 按个体+区间分组,计算均值并赋值给整个区间的
mean_variable
library(dplyr) panel_data <- panel_data %>% arrange(id, year) %>% group_by(id) %>% mutate(regime_group = cumsum(new_regime)) %>% group_by(id, regime_group) %>% mutate(mean_variable = mean(variable, na.rm = TRUE)) %>% ungroup()
如果需要排除第一个new_regime=1之前的初始区间(即regime_group=0的部分),可以在最后加一行filter(regime_group != 0)。
Python语言实现(基于pandas)
同样假设数据框名为panel_data,包含所需字段,实现逻辑和R一致:
- 先按个体和年份排序
- 按个体分组计算
new_regime的累积和,生成区间标识 - 用
transform方法将区间均值广播到该区间的所有观测
import pandas as pd # 确保数据时序正确 panel_data = panel_data.sort_values(['id', 'year']) # 生成个体内的政权区间分组 panel_data['regime_group'] = panel_data.groupby('id')['new_regime'].cumsum() # 计算区间均值并赋值 panel_data['mean_variable'] = panel_data.groupby(['id', 'regime_group'])['variable'].transform(lambda x: x.mean(skipna=True))
同样,若要过滤初始无政权的区间,可执行panel_data = panel_data[panel_data['regime_group'] != 0]。
内容的提问来源于stack exchange,提问作者Student In Need
相关产品推荐
相关产品推荐

