如何使用for循环计算冲突爆发前的和平年数并生成peace变量
R语言实现和平年数统计方案
核心需求
按国家分组统计冲突爆发(conflict==1)前的连续和平年数:和平年份对应值为0,冲突年份取前序连续和平年的累计值,连续冲突年份保持该累计值不变。
最优实现方式
使用dplyr的向量化分组操作,相比for循环运行效率更高,尤其适配大样本面板数据,无需手动处理国家分组边界,逻辑更严谨。
实现代码
# 加载依赖包 library(dplyr) # 构造示例数据 Df <- data.frame( country = c("A", "A", "A", "A", "A", "B","B", "B", "B"), year = c("1950", "1951", "1952", "1953", "1954", "1950", "1951", "1952", "1953"), conflict = c(0, 0, 1, 1, 0, 0, 1, 0, 1) ) # 计算peace变量 Df <- Df %>% # 按国家分组处理 group_by(country) %>% # 标记新和平期的起始:上一期是冲突/分组首行,本期是和平 mutate(peace_period = cumsum(lag(conflict, default = 1) == 1 & conflict == 0)) %>% # 按国家+和平期分组,计算该和平期的总长度 group_by(country, peace_period) %>% mutate(peace_length = n()) %>% # 生成最终peace列:和平年取0,冲突年取对应和平期长度 ungroup() %>% mutate(peace = ifelse(conflict == 0, 0, peace_length)) %>% # 移除中间辅助列 select(-peace_period, -peace_length)
运行后输出的peace列与预期完全匹配:c(0, 0, 2, 2, 0, 0, 1, 0, 1)。
内容的提问来源于stack exchange,提问作者Carmela
相关产品推荐
相关产品推荐

