在不平衡面板数据中获取不同组的移动平均值

问题描述 投票:0回答: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

我想要做的是使用价值数据获取每个国家/地区每个组的 2 个周期移动平均值的新列。我该怎么做?

r moving-average
2个回答
0
投票

如果您只是想按组计算滚动平均值,您可以这样做:

library(dplyr)
library(zoo)

df |>
  mutate(ma = rollmean(value, 2, na.pad = TRUE, align = "right"), 
         .by = c(country, group))

输出

   country group  year  value       ma
   <chr>   <chr> <dbl>  <dbl>    <dbl>
 1 ARG     A      1990    346     NA  
 2 ARG     A      1991 573547 286946. 
 3 ARG     A      1992    534 287040. 
 4 ARG     A      1993   4645   2590. 
 5 ARG     A      1994    454   2550. 
 6 ARG     B      1992   3453     NA  
 7 ARG     B      1993     64   1758. 
 8 ARG     B      1994     75     69.5
 9 BRA     A      1990    346     NA  
10 BRA     A      1991   3465   1906. 
11 BRA     A      1992     46   1756. 
12 BRA     A      1993    876    461  

0
投票

实现直接滚动功能并使用

ave

应用它
rollmeanr = \(x, k, ...) {
  stopifnot(is.numeric(x), is.integer(k))
  res = rep(NA, length(x))
  for (i in seq_along(x)) 
    # ~ "right-aligned"
    if (i > k) res[i] = mean( x[(i-k+1L):i], ...)
  res
}
df$rm = with(df, ave(x = value, country, group, FUN = \(x) rollmeanr(x, k = 2L)))

df
   country group year  value       rm
1      ARG     A 1990    346       NA
2      ARG     A 1991 573547       NA
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       NA
8      ARG     B 1994     75     69.5
9      BRA     A 1990    346       NA
10     BRA     A 1991   3465       NA
11     BRA     A 1992     46   1755.5
12     BRA     A 1993    876    461.0

从您的问题中不清楚,您是否还考虑了潜在的

year
差距。如果简单的 for 循环 不够快,请查看
{xts}
{collapse}

© www.soinside.com 2019 - 2024. All rights reserved.