基于滑动窗口聚合时序数据生成新列的通用实现问询
分组时序数据的通用特征构造方法
问题背景
现有分组后的R语言tibble时序数据如下:
df <- tibble(ID = c(1, 1, 1, 1, 1), v1 = c(3, 5, 1, 0, 1), v2 = c(10, 6, 1, 20, 23), Time = c(as.POSIXct("1900-01-01 10:00:00"), as.POSIXct("1900-01-01 11:00:00"), as.POSIXct("1900-01-01 13:00:00"), as.POSIXct("1900-01-01 16:00:00"), as.POSIXct("1900-01-01 20:00:00"))) %>% group_by(ID)
数据展示:
# A tibble: 5 x 4 # Groups: ID [1] ID v1 v2 Time <dbl> <dbl> <dbl> <dttm> 1 1 3 10 1900-01-01 10:00:00 2 1 5 6 1900-01-01 11:00:00 3 1 1 1 1900-01-01 13:00:00 4 1 0 20 1900-01-01 16:00:00 5 1 1 23 1900-01-01 20:00:00
需要实现通用的时序特征构造:
- 对每个时间步,将最近
n个时间步的数值特征转为特征向量 - 记录每个前置时间步与当前步的小时级时间差,无前置数据的位置填充0或NA
- 支持调整
n值,同时兼容任意数量的数值特征列
以n=2为例,期望输出:
# A tibble: 5 x 6 ID v1_t1 v2_t1 time_t1 v1_t2 v2_t2 <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 0 0 NA 3 10 2 1 3 10 1 5 6 3 1 5 6 2 1 1 4 1 1 1 3 0 20 5 1 0 20 4 1 23
解决方案
使用dplyr+tidyr组合实现通用逻辑,核心通过滞后操作生成多步历史特征,同时计算时间差:
library(dplyr) library(tidyr) # 定义通用特征构造函数 create_time_lag_features <- function(data, n_lags, value_cols, time_col = "Time") { # 获取分组列 group_cols <- group_vars(data) data %>% # 将当前步特征重命名为_t{n_lags}(如n=2时为v1_t2) rename_with(~paste0(., "_t", n_lags), all_of(value_cols)) %>% mutate( # 生成1到n_lags-1步的滞后特征,无数据填充0 across(all_of(paste0(value_cols, "_t", n_lags)), list( !!!set_names( map(1:(n_lags-1), ~lag(., n = .x, default = 0)), paste0("{.col}_t", 1:(n_lags-1)) ) ), .names = "{gsub(paste0('_t', n_lags), '', .col)}_t{.fn}"), # 生成每个滞后步与当前步的小时时间差,无数据返回NA !!!set_names( map(1:(n_lags-1), ~as.numeric(difftime(!!sym(time_col), lag(!!sym(time_col), n = .x), units = "hours"))), paste0("time_t", 1:(n_lags-1)) ) ) %>% # 移除原始时间列 select(-all_of(time_col)) %>% # 调整列顺序:分组列 → 历史步特征 → 时间差 → 当前步特征 select(all_of(group_cols), ends_with("_t1"), matches("time_t1"), ends_with("_t2"), matches("time_t2"), everything()) } # 调用函数:n=2,数值特征列为v1、v2 result <- create_time_lag_features(df, n_lags = 2, value_cols = c("v1", "v2")) # 查看结果 print(result)
代码说明
通用性设计:
- 通过
value_cols参数指定需要生成滞后特征的数值列,支持任意数量的列 n_lags参数控制聚合的时间步数量,调整后自动生成对应数量的特征列- 自动识别分组列,确保每个ID内独立处理时序
- 通过
关键逻辑:
- 先将当前步数值列重命名为
_t{n_lags},作为特征向量的最新一步 - 对当前步特征执行滞后操作,生成前1到n_lags-1步的特征,无数据时用
0填充 - 用
difftime计算每个滞后步与当前步的小时差,无前置数据时返回NA - 自动调整列顺序,让同一步的特征和时间差相邻,便于后续建模
- 先将当前步数值列重命名为
扩展支持:
调整n_lags参数即可实现不同步长的特征聚合,比如设置n_lags=3时,会生成_t1、_t2、_t3三类特征及对应时间差列。
内容的提问来源于stack exchange,提问作者Ai4l2s
相关产品推荐
相关产品推荐

