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

在R中基于连续两年特定值创建新变量及问题排查

解决UCDP战斗死亡数据集的两个筛选问题

问题1:筛选2008年后连续两年战斗死亡≥1000的国家

你的代码存在两个关键问题:

  1. 语法错误:subset函数多了一个右括号,导致代码无法正确执行
  2. 逻辑错误:使用all(sum_deaths_two_years >= 2000)要求该国家所有计算出的sum_deaths_two_years都≥2000,但实际上我们只需要存在至少一次连续两年≥1000的情况,all会过滤掉那些只有部分年份符合条件的国家,导致无观测结果。

修正后的代码:

library(dplyr)

# 修正语法错误,筛选2008年后bd_best≥1000的行
filtered_data <- subset(BattleDeaths_v22_1_conf, bd_best >= 1000 & year >= 2008)

# 按国家和年份排序,计算连续两年的死亡数之和
filtered_data <- filtered_data %>%
  arrange(location_id, year) %>%  # 注意:确认数据集里的国家变量名是location_id还是location_inc
  group_by(location_id) %>%
  mutate(sum_deaths_two_years = lag(bd_best) + bd_best)

# 筛选存在至少一次连续两年≥1000的国家
final_data <- filtered_data %>%
  group_by(location_id) %>%
  filter(any(sum_deaths_two_years >= 2000, na.rm = TRUE))  # na.rm=TRUE排除第一年的NA值

如果只需要保留符合连续两年条件的具体年份行,而非整个国家的所有行,可以简化为:

final_data <- filtered_data %>%
  arrange(location_id, year) %>%
  group_by(location_id) %>%
  filter(bd_best >= 1000 & lag(bd_best) >= 1000)  # 直接判断当前年和前一年都≥1000

问题2:标记满足“某一年战斗死亡≥1000且前/后一年≥25”的观测

用lag()和lead()函数获取前后年份的死亡数,通过条件判断创建标记变量:

# 基于原始数据集处理,保留所有年份
result_data <- BattleDeaths_v22_1_conf %>%
  arrange(location_id, year) %>%
  group_by(location_id) %>%
  mutate(
    # 1表示符合条件,0表示不符合;default=0处理首尾年份无前后数据的情况
    meets_criteria = ifelse(
      bd_best >= 1000 & (lag(bd_best, default = 0) >= 25 | lead(bd_best, default = 0) >= 25),
      1,
      0
    )
  )

# 筛选出所有符合条件的观测行
filtered_criteria <- result_data %>% filter(meets_criteria == 1)

内容的提问来源于stack exchange,提问作者Maria Mola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:32:34