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
相关产品推荐
相关产品推荐

