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

如何在非平衡面板数据中按国家-组计算2期移动平均值?

非平衡面板数据按国家-组别计算2期移动平均值

问题场景

现有一组非平衡面板数据,按国家、年份、组别划分:

  • 同一国家同一年份可能存在多个组别数据,也可能无数据
  • 不同国家、不同组别的时间跨度不一致

示例数据

library(tibble)
df <- tibble(
  country = c("ARG", "ARG", "ARG", "ARG", "ARG", "ARG", "ARG", "ARG", "BRA", "BRA", "BRA", "BRA"),
  group = c("A", "A", "A", "A", "A", "B", "B", "B", "A", "A", "A", "A"),
  year = c(1990, 1991, 1992, 1993, 1994, 1992, 1993, 1994, 1990, 1991, 1992, 1993),
  value = c(346, 573547, 534, 4645, 454, 3453, 64, 75, 346, 3465, 46, 876)
)

数据预览:

country group  year  value
   <chr>   <chr> <dbl>  <dbl>
 1 ARG     A      1990    346
 2 ARG     A      1991 573547
 3 ARG     A      1992    534
 4 ARG     A      1993   4645
 5 ARG     A      1994    454
 6 ARG     B      1992   3453
 7 ARG     B      1993     64
 8 ARG     B      1994     75
 9 BRA     A      1990    346
10 BRA     A      1991   3465
11 BRA     A      1992     46
12 BRA     A      1993    876

需求:新增一列,计算每个国家内各组别value字段的2期移动平均值。

解决方案

使用dplyr包的分组与窗口函数实现,步骤如下:

library(dplyr)

df_result <- df %>%
  # 按国家和组别分组,限定计算范围
  group_by(country, group) %>%
  # 每组内按年份升序排序(非平衡面板必须操作,避免lag取数错误)
  arrange(year, .by_group = TRUE) %>%
  # 计算2期移动平均:当前值+前一期值的均值
  mutate(ma_2 = (value + lag(value)) / 2) %>%
  # 取消分组,恢复普通数据框结构
  ungroup()

结果展示

运行代码后得到的结果:

# A tibble: 12 × 5
   country group  year  value    ma_2
   <chr>   <chr> <dbl>  <dbl>   <dbl>
 1 ARG     A      1990    346      NA
 2 ARG     A      1991 573547 266946.5
 3 ARG     A      1992    534 287040.5
 4 ARG     A      1993   4645   2589.5
 5 ARG     A      1994    454   2549.5
 6 ARG     B      1992   3453      NA
 7 ARG     B      1993     64   1758.5
 8 ARG     B      1994     75     69.5
 9 BRA     A      1990    346      NA
10 BRA     A      1991   3465   1905.5
11 BRA     A      1992     46   1755.5
12 BRA     A      1993    876    461  

关键细节

  • group_by(country, group):确保移动平均仅在同一国家同一组别内计算,不会跨组或跨国家
  • arrange(year, .by_group = TRUE):非平衡面板中各组时间序列可能乱序,排序后lag()才能正确取到前一年的数据
  • lag(value):调用窗口函数获取当前行的前一行value值,两者取平均得到2期移动平均;每组第一行无前置数据,结果为NA

内容的提问来源于stack exchange,提问作者Pedro Cardoso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:20:25