按组计算列中值为1的事件间和平年数的代码优化需求
符合需求的和平年数计算代码
核心需求
- 和平年数累计延续至冲突年份,冲突年的peace值不重置为0
- 冲突年份的下一年,peace值从0开始
问题代码分析
- peace1:冲突年份的peace1计算逻辑会导致其无法延续累计值,比如上一次冲突在2018年,2021年冲突时peace1仅为2,未覆盖到冲突当年的累计
- peace2:分组逻辑错误,既无法让冲突年延续累计值,也不符合冲突下一年从0开始计数的要求
修正后的代码
# 先确保数据按国家和年份升序排列 d_muslim <- d_muslim %>% arrange(country, year) %>% group_by(country) %>% mutate( # 标记新周期起点:第一次观测默认开启第一个周期,冲突年份的下一行开启新周期 new_cycle = lag(conflict == 1, default = TRUE), # 生成每个周期的唯一ID cycle_id = cumsum(new_cycle) ) %>% # 按国家+周期分组计算peace值 group_by(country, cycle_id) %>% mutate(peace = year - first(year)) %>% ungroup() %>% # 清理辅助变量 select(-new_cycle, -cycle_id)
逻辑说明
- 排序校验:先按国家和年份排序,保证时间序列的连续性
- 周期划分:通过
new_cycle标记每个和平周期的起点,冲突发生后,下一年自动开启新周期 - 累计计算:每个周期内,peace值为当前年份与周期起始年份的差值,实现:
- 冲突下一年作为周期起点,peace值为0
- 后续年份(包括冲突年)逐年累计,直到下一次冲突触发新周期
内容的提问来源于stack exchange,提问作者MalleOne
相关产品推荐
相关产品推荐

