如何为IPI_index_wide各区域列添加移动平均新列(不覆盖原列)
问题描述
现有数据框IPI_index_wide结构如下:
structure(list(time = c("gen. 2019", "febr. 2019", "març 2019", "abr. 2019", "maig 2019", "juny 2019"), `Unió Europea` = c(104, 103.8, 114.4, 105.7, 106.7, 107.9), `Zona Euro` = c(102.7, 102.3, 112.6, 104, 104.7, 106.3), Alemanya = c(96.3, 99.6, 112.3, 100.6, 100.7, 103.3), Espanya = c(105.6, 105.7, 112.1, 104, 112.9, 110.4 ), França = c(107.2, 104.2, 114.4, 105, 101.6, 108.4), Itàlia = c(101, 108.2, 116.1, 102.2, 114.2, 110.8)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
需求:为Unió Europea、Zona Euro、Alemanya、Espanya、França、Itàlia这些区域列,分别添加新列计算当前月份及其前三个月的移动平均,新列命名规则为原列名_ma。
尝试过以下代码,但会覆盖原有列,需要正确实现方式:
ma <- function(x, n=3) {stats::filter(x, rep(1,n), sides = 1)/n} IPI_index_wide <- IPI_index_wide %>% ma()
解决方案
可以用dplyr的mutate()结合across()函数,对指定列批量处理,保留原列的同时生成新的移动平均列。具体实现如下:
library(dplyr) # 定义移动平均函数 ma <- function(x, n=3) { stats::filter(x, rep(1, n), sides = 1) / n } # 批量处理指定列,生成新列 IPI_index_wide <- IPI_index_wide %>% mutate(across(c(`Unió Europea`, `Zona Euro`, Alemanya, Espanya, França, Itàlia), ~ ma(.), .names = "{.col}_ma"))
代码说明
across():指定需要处理的目标列集合;~ ma(.):对每一列应用自定义的移动平均函数;.names = "{.col}_ma":自动生成新列名,{.col}会替换为原列名,最终得到原列名_ma格式的新列;- 操作后会保留原数据框所有列,同时新增对应的移动平均列。
如果不想手动罗列所有区域列,也可以通过排除time列来批量选择目标列:
IPI_index_wide <- IPI_index_wide %>% mutate(across(-time, ~ ma(.), .names = "{.col}_ma"))
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

