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

如何更简洁优雅地实现数据框列的滑动窗口生成与合并?

滑动窗口转换与合并的优化实现

问题概述

需求:

  • 基于包含多变量的DataFrame
  • 为每个变量生成指定大小的滑动窗口
  • 将所有滑动窗口结果合并为矩阵或DataFrame

当前实现步骤:

  1. 创建示例DataFrame
df <- data.frame(A=paste0("a",1:10),
                 B=paste0("b",1:10),
                 C=paste0("c",1:10))
  1. 定义滑动窗口函数并生成窗口列表
roll_window <- function(x,n=3) embed(x,dim = n)[,n:1]
list_of_windows <- lapply(df, roll_window) 
  1. 合并窗口列表
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:36:13