按时间顺序筛选面板数据:保留援助早于冲突的案例
筛选援助早于冲突的国家案例(R语言实现)
我来帮你解决这个筛选需求——只保留援助发生时间早于冲突的国家案例,排除像B国这种援助晚于冲突的情况。咱们先从你的示例数据集入手:
示例原始数据集
dt <- data.frame( name = rep(c("A", "B", "C"), each = 3), year = c(2001:2003, 2001:2003, 2001:2003), Aid = c(1, 0, 0, 0, 0, 1, 1, 0, 1), conflict = c(0, 0, 1, 1, 1, 0, 0, 1, 1) )
先梳理下每个国家的时间线:
- A国:2001年获得援助,2003年爆发冲突 → 援助早于冲突,保留
- B国:2001-2002年已爆发冲突,2003年才获得援助 → 援助晚于冲突,排除
- C国:2001年获得援助,2002-2003年爆发冲突 → 援助早于冲突,保留
实现方法(两种可选)
方法1:使用dplyr包(直观易读)
如果习惯用tidyverse风格的代码,推荐这种方式——按国家分组后计算首次援助和首次冲突的年份,再筛选符合条件的国家:
library(dplyr) dt1 <- dt %>% group_by(name) %>% mutate( # 计算每个国家首次获得援助的年份,无援助则设为Inf first_aid_year = ifelse(any(Aid == 1), min(year[Aid == 1]), Inf), # 计算每个国家首次爆发冲突的年份,无冲突则设为Inf first_conflict_year = ifelse(any(conflict == 1), min(year[conflict == 1]), Inf) ) %>% # 筛选条件:要么无冲突但有援助,要么有冲突且援助早于冲突 filter( (is.infinite(first_conflict_year) & !is.infinite(first_aid_year)) | (!is.infinite(first_conflict_year) & first_aid_year < first_conflict_year) ) %>% # 移除辅助计算的列 select(-first_aid_year, -first_conflict_year) %>% ungroup() # 查看最终结果 print(dt1)
方法2:使用Base R(无需额外包)
如果不想加载第三方包,可以用基础R的聚合逻辑实现:
# 计算每个国家的首次援助/冲突年份 country_metrics <- lapply(split(dt, dt$name), function(country_data) { data.frame( name = unique(country_data$name), first_aid_year = ifelse(any(country_data$Aid == 1), min(country_data$year[country_data$Aid == 1]), Inf), first_conflict_year = ifelse(any(country_data$conflict == 1), min(country_data$year[country_data$conflict == 1]), Inf) ) }) country_metrics <- do.call(rbind, country_metrics) # 筛选符合条件的国家 valid_names <- country_metrics$name[ (is.infinite(country_metrics$first_conflict_year) & !is.infinite(country_metrics$first_aid_year)) | (!is.infinite(country_metrics$first_conflict_year) & country_metrics$first_aid_year < country_metrics$first_conflict_year) ] # 提取最终数据集 dt1 <- dt[dt$name %in% valid_names, ] # 查看最终结果 print(dt1)
最终结果
两种方法都会得到你预期的数据集,只保留A国和C国的所有记录,排除B国:
> print(dt1) name year Aid conflict 1 A 2001 1 0 2 A 2002 0 0 3 A 2003 0 1 7 C 2001 1 0 8 C 2002 0 1 9 C 2003 1 1
内容的提问来源于stack exchange,提问作者user9563072
相关产品推荐
相关产品推荐

