如何更简洁优雅地实现数据框列的滑动窗口生成与合并?
滑动窗口转换与合并的优化实现
问题概述
需求:
- 基于包含多变量的DataFrame
- 为每个变量生成指定大小的滑动窗口
- 将所有滑动窗口结果合并为矩阵或DataFrame
当前实现步骤:
- 创建示例DataFrame
df <- data.frame(A=paste0("a",1:10), B=paste0("b",1:10), C=paste0("c",1:10))
- 定义滑动窗口函数并生成窗口列表
roll_window <- function(x,n=3) embed(x,dim = n)[,n:1] list_of_windows <- lapply(df, roll_window)
- 合并窗口列表
do.call(cbind, list_of_windows)
预期输出:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [1,] "a1" "a2" "a3" "b1" "b2" "b3" "c1" "c2" "c3" [2,] "a2" "a3" "a4" "b2" "b3" "b4" "c2" "c3" "c4" [3,] "a3" "a4" "a5" "b3" "b4" "b5" "c3" "c4" "c5" [4,] "a4" "a5" "a6" "b4" "b5" "b6" "c4" "c5" "c6" [5,] "a5" "a6" "a7" "b5" "b6" "b7" "c5" "c6" "c7" [6,] "a6" "a7" "a8" "b6" "b7" "b8" "c6" "c7" "c8" [7,] "a7" "a8" "a9" "b7" "b8" "b9" "c7" "c8" "c9" [8,] "a8" "a9" "a10" "b8" "b9" "b10" "c8" "c9" "c10"
技术疑问:能否用更简洁优雅的代码实现上述步骤2和3的功能?
优化实现方案
方案一:使用purrr包(推荐)
借助purrr::map_dfc可以一步完成窗口生成与列合并,无需单独定义函数和中间列表:
library(purrr) map_dfc(df, \(x) embed(x, 3)[,3:1])
方案二:基础R简化版
如果不想依赖第三方包,可将窗口逻辑直接嵌入lapply,并用do.call合并,减少临时变量:
do.call(cbind, lapply(df, \(x) embed(x, 3)[,3:1]))
关键说明
\(x)是R 4.1.0+支持的匿名函数语法,等价于function(x),写法更紧凑map_dfc会自动将每个变量的处理结果按列合并为DataFrame,省去手动调用do.call(cbind, ...)的步骤- 两种方案的输出结果与原代码完全一致,代码更简洁,减少了不必要的中间变量定义
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

