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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:55:19