我有这些面板数据,这些数据根据国家、年份和群体的不同而有所不同。同一年的同一国家可以有不同群体的数据,也可以没有。该面板不平衡,因此它不涵盖每个国家或每个组的相同时间跨度。
为简单起见,数据如下所示:
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 个周期移动平均值的新列。我该怎么做?
如果您只是想按组计算滚动平均值,您可以这样做:
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
实现直接滚动功能并使用
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}
。