如何用大小为5的滑动窗口从主数据集生成五列新数据集?
解决方案
首先构造你的原始数据集:
library(tidyverse) library(slider) # 原始数据集 dataset <- tibble( disp1 = c(-2.5, 1.3, -1.7, -8.9, -5, -4.8, -7.7, 3.4, 14.2, -10.2), disp2 = c(-4.8, 0.6, -6.4, 9.7, -3.1, -5.7, -4.4, 1.8, 3.5, 5.4), disp3 = c(-1.4, 3.1, -1.7, -5.3, -1.1, -0.1, -3.7, 15.5, 7.2, -8.6) )
接下来按以下步骤生成目标数据集:
- 将原始数据集按列优先的顺序转换成一个长向量:
vec <- dataset %>% pivot_longer(cols = everything(), values_to = "value") %>% pull(value)
- 对这个长向量使用大小为5的滑动窗口,将每个窗口拆分为
I-IV(窗口前4个值)和Output(窗口第5个值):
newdata <- slide(vec, ~.x, .before = 4, .complete = TRUE) %>% map_dfr(function(window) { tibble( I = window[1], II = window[2], III = window[3], IV = window[4], Output = window[5] ) })
运行后得到的newdata就完全符合你给出的预期结果。
关键说明
slider::slide函数用于生成滑动窗口,.before = 4表示每个窗口包含当前元素及之前的4个元素(总大小为5),.complete = TRUE确保只保留完整的5元素窗口。- 先将数据集转成列优先的长向量,是因为你的预期结果是把所有列的元素按列顺序拼接后再做滑动窗口,这是之前你用
mutate和循环没匹配到的核心逻辑。
内容的提问来源于stack exchange,提问作者cidc12
相关产品推荐
相关产品推荐

