如何在R数据集中创建国家民主水平的滚动三年平均新变量?
解决方案
你的数据已经按「国家+年份」顺序排列(每行对应同一国家的下一年),不需要用case_when(),核心是按国家分组后,计算前3年观测的滑动均值。以下是两种实用实现方式:
方法一:用dplyr + slider(推荐,处理年份缺失更灵活)
先确保数据按国家和年份排序(如果未排序),再通过滑动窗口函数精准取前3年(T-3、T-2、T-1)的民主水平均值:
library(dplyr) library(slider) # 假设数据框为df,列名分别是country(国家)、year(年份)、democracy(民主水平) df <- df %>% arrange(country, year) %>% # 确保排序正确 group_by(country) %>% mutate( # 计算前3年的均值,仅当窗口有完整3个数据时返回结果,否则为NA democracy_lag3_mean = slide_dbl( democracy, ~mean(.x, na.rm = TRUE), .before = 3, # 取当前行之前的3行 .after = -1, # 排除当前行 .complete = TRUE ) ) %>% ungroup()
方法二:仅用dplyr(无需额外安装包)
通过lag()函数手动提取前1、2、3年的数值,再计算均值:
library(dplyr) df <- df %>% arrange(country, year) %>% group_by(country) %>% mutate( lag1_dem = lag(democracy, 1), # T-1年的民主水平 lag2_dem = lag(democracy, 2), # T-2年的民主水平 lag3_dem = lag(democracy, 3), # T-3年的民主水平 # 计算均值,na.rm=TRUE可处理部分年份缺失的情况 democracy_lag3_mean = rowMeans(cbind(lag1_dem, lag2_dem, lag3_dem), na.rm = TRUE) ) %>% select(-lag1_dem, -lag2_dem, -lag3_dem) %>% # 删除临时列 ungroup()
关键注意点
- 如果数据存在年份缺失(比如某国缺少某一年的观测),方法一的滑动窗口会自动适配,只取存在的前3个有效年份;方法二会在缺失位置返回NA,若需要严格仅用完整3年数据计算,可添加
filter(!is.na(lag1_dem) & !is.na(lag2_dem) & !is.na(lag3_dem))。 .complete = TRUE参数会让国家的前3行(比如1950、1951、1952年)返回NA,因为没有足够的前序年份数据,符合学术研究的严谨性。
内容的提问来源于stack exchange,提问作者Felix Barth
相关产品推荐
相关产品推荐

