在R中基于连续两年特定值创建新变量及问题排查
解决UCDP战斗死亡数据集的两个筛选问题
问题1:筛选2008年后连续两年战斗死亡≥1000的国家
你的代码存在两个关键问题:
- 语法错误:
subset函数多了一个右括号,导致代码无法正确执行 - 逻辑错误:使用
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
相关产品推荐
相关产品推荐

