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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:42