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

R语言面板数据:OP=1时删除该国后续观测的实现方法

面板数据按国家截断后续观测的实现方案

依赖包准备

新手优先用dplyr的分组逻辑处理面板操作,代码可读性强,不容易写错:

  • 首次运行先安装需要的包:
install.packages(c("dplyr", "haven"))
  • 加载包并导入原始面板数据:
library(dplyr)
library(haven)

# 导入示例面板数据
Panel <- read_dta("http://dss.princeton.edu/training/Panel101.dta")

核心实现逻辑

完全匹配需求规则:

  1. 按country字段对样本拆分,每个国家单独处理
  2. 定位每个国家对应的op=1的年份:因为提到每个国家仅出现一次op=1,直接提取该值即可
  3. 对该国样本做筛选:保留op=1年份及之前的所有观测(包含op=0和op=1的样本,满足logit建模的样本要求),删除该年份之后的所有观测
  4. 对从未出现op=1的国家,默认保留全部样本,避免误删

可直接运行的清洗代码

Panel_clean <- Panel %>%
  # 按国家分组单独处理
  group_by(country) %>%
  # 计算每个国家的样本截断年份
  mutate(
    cutoff_year = case_when(
      # 如果该国存在op=1,截断年份就是op=1对应的年份
      any(op == 1) ~ year[op == 1],
      # 如果该国从来没有op=1,截断年份设为该国最大年份(等于全保留)
      TRUE ~ max(year)
    )
  ) %>%
  # 筛选出截断年份及之前的观测
  filter(year <= cutoff_year) %>%
  # 取消分组
  ungroup() %>%
  # 删除临时生成的截断年份列,还原原始数据结构
  select(-cutoff_year)

结果校验(新手必须做,避免错删样本)

跑清洗代码后必须手动核对结果,避免逻辑偏差:

  • 第一步:汇总查看每个国家的保留区间,确认没有提前截断的情况
# 查看每个国家的样本保留范围
Panel_clean %>%
  group_by(country) %>%
  summarise(
    起始年份 = min(year),
    截止年份 = max(year),
    op为1的样本数 = sum(op == 1)
  )
  • 第二步:抽选单个国家对比原始数据和清洗后的数据,确认op=1年份之后的观测已经全部删除
# 例如对比A国的原始、清洗后样本
Panel %>% filter(country == "A")
Panel_clean %>% filter(country == "A")

注意:如果实际数据集里某个国家存在多次op=1的情况,只要把year[op ==1]改成min(year[op ==1]),就会自动从最早的op=1年份开始截断,适配常规事件研究类数据的处理要求。

内容的提问来源于stack exchange,提问作者Thierno Bocar Diop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 15:24:03