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

R语言dplyr动态生成任意滞后特征与滑动移动平均特征实现方法

核心运算符说明
  • {{}}:也叫curly-curly运算符,用于直接传递列选择表达式作为函数参数,无需手动解析,适合封装成函数时传参使用,比如你封装一个特征生成函数,参数是target_col,调用的时候写across({{target_col}}, ...)就可以直接传入starts_with("var")这类选择规则。
  • !!:解引用运算符,用于把已经存储在变量中的值/表达式插入到dplyr的执行上下文,让dplyr将其识别为语法的一部分而非普通字符串/变量,比如下文代码里把提前定义的target_vars选择规则传入across时就用了!!。
  • :=:动态赋值运算符,dplyr原生的=不支持左侧使用动态生成的字符串作为列名,使用:=就可以实现左边放解引用后的动态列名,在dplyr 1.0.0以上版本,across的.names参数已经内置了动态命名能力,大部分场景不需要手动写:=。
自定义实现代码

依赖环境:dplyr >= 1.0.0,zoo(用于滚动计算)

完整可运行示例

# 加载依赖
library(dplyr)
library(zoo)

# 样例数据
n <- 30 # 调大样本量适配更长的滑动窗口
set.seed(123)
foo <- data.frame(
  date = seq(as.Date('2020-01-01'),length.out = n, by = 'day'),
  var1 = sample.int(n),
  var2 = sample.int(n)
)

# 自定义参数配置
lag_features <- c(3,6,9) # 自定义滞后阶数
ma_features <- c(12,15) # 自定义滑动窗口长度
target_vars <- starts_with("var") # 目标变量选择规则

# 第一步:生成指定阶数的滞后特征
foo_with_lag <- foo
for (lag_n in lag_features) {
  foo_with_lag <- foo_with_lag %>%
    mutate(
      across(!!target_vars,
             ~ lag(.x, n = lag_n),
             # 动态命名模板,可按需修改格式
             .names = "{.col}_lag_{lag_n}"
      )
    )
}

# 第二步:生成指定窗口的滑动平均特征
lag_cols <- names(foo_with_lag)[grepl("_lag_", names(foo_with_lag))]
foo_with_feats <- foo_with_lag
for (ma_k in ma_features) {
  foo_with_feats <- foo_with_feats %>%
    mutate(
      across(all_of(lag_cols),
             ~ rollmean(.x, k = ma_k, align = "right", fill = NA),
             # 动态命名模板,可按需修改格式
             .names = "{.col}_ra_{ma_k}"
      )
    )
}

# 查看生成的特征名
names(foo_with_feats)

运行后生成的特征名完全符合要求,例如var1_lag_3_ra_12、var2_lag_9_ra_15等。

灵活调整说明
  • 命名规则修改:直接修改across的.names参数里的字符串模板即可,例如把后缀改成_L{lag_n}、_MA{ma_k}就可以生成var1_L3_MA12格式的特征名。
  • 变量选择修改:修改target_vars的取值即可,支持所有dplyr列选择语法,例如c(var1, var2)、ends_with("val")等。
  • 滑动计算逻辑修改:把rollmean替换为rollmedian、rollsum等函数即可生成其他类型的滑动特征,也可以传入自定义函数。
  • 封装为函数:如果需要多次调用,可以把上述逻辑封装为函数,参数用{{target_vars}}接收列选择规则即可。

内容的提问来源于stack exchange,提问作者takmers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:18:02