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

按时间顺序筛选面板数据:保留援助早于冲突的案例

筛选援助早于冲突的国家案例(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:44:46