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

基于滑动窗口聚合时序数据生成新列的通用实现问询

分组时序数据的通用特征构造方法

问题背景

现有分组后的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)

代码说明

  1. 通用性设计:

    • 通过value_cols参数指定需要生成滞后特征的数值列,支持任意数量的列
    • n_lags参数控制聚合的时间步数量,调整后自动生成对应数量的特征列
    • 自动识别分组列,确保每个ID内独立处理时序
  2. 关键逻辑:

    • 先将当前步数值列重命名为_t{n_lags},作为特征向量的最新一步
    • 对当前步特征执行滞后操作,生成前1到n_lags-1步的特征,无数据时用0填充
    • 用difftime计算每个滞后步与当前步的小时差,无前置数据时返回NA
    • 自动调整列顺序,让同一步的特征和时间差相邻,便于后续建模
  3. 扩展支持:
    调整n_lags参数即可实现不同步长的特征聚合,比如设置n_lags=3时,会生成_t1、_t2、_t3三类特征及对应时间差列。


内容的提问来源于stack exchange,提问作者Ai4l2s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:45:33