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

R语言如何实现针对特定季节的多步滞后数据提取

R自定义函数实现指定春季滞后值提取

前置准备

首先对原始数据集做基础校验,确保数据按时间升序排列,每年季节顺序固定为winter→spring→summer→fall,再拆分出季节、年份字段方便后续匹配:

library(dplyr)
library(stringr)

# 构造示例数据集
df <- data.frame(
  SeasonYear = c("winter2000", "spring2000", "summer2000", "fall2000",
                 "winter2001", "spring2001", "summer2001", "fall2001",
                 "winter2002", "spring2002"),
  mean = c(0.957, 0.943, 1.03, 0.981, 1.06, 1.05, 1.02, 1.03, 1.02, 1.05)
)

# 拆分季节与年份字段
df <- df %>%
  mutate(
    season = str_extract(SeasonYear, "^[a-z]+"),
    year = as.integer(str_extract(SeasonYear, "\\d+$"))
  )

自定义滞后提取函数

函数参数说明:

  • data:输入数据集
  • n:回溯的春季个数,默认值为1
lag_spring <- function(data, n = 1){
  # 提取所有春季的行位置与对应均值
  spring_pos <- seq(2, nrow(data), 4)
  spring_vals <- data$mean[spring_pos]
  
  # 生成滞后列
  lag_col <- rep(NA, nrow(data))
  for(i in seq_along(spring_vals)){
    if(i > n){
      start_row <- spring_pos[i] + 1
      end_row <- min(spring_pos[i] + 4, nrow(data))
      lag_col[start_row:end_row] <- spring_vals[i - n]
    }
  }
  # 动态生成列名
  data[[paste0("lag_spring_", n)]] <- lag_col
  return(data)
}

效果测试

回溯1个春季(n=1)

df_n1 <- lag_spring(df, n = 1)

输出结果与需求一致:

SeasonYearmeanlag_spring_1
winter20000.957NA
spring20000.943NA
summer20001.030.943
fall20000.9810.943
winter20011.060.943
spring20011.050.943
summer20011.021.05
fall20011.031.05
winter20021.021.05
spring20021.051.05

回溯2个春季(n=2)

df_n2 <- lag_spring(df, n = 2)

输出结果与需求一致:

SeasonYearmeanlag_spring_2
winter20000.957NA
spring20000.943NA
summer20001.03NA
fall20000.981NA
winter20011.06NA
spring20011.05NA
summer20011.020.943
fall20011.030.943
winter20021.020.943
spring20021.050.943

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:06:04