如何在非平衡面板数据中按国家-组计算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
相关产品推荐
相关产品推荐

