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)
输出结果与需求一致:
| SeasonYear | mean | lag_spring_1 |
|---|---|---|
| winter2000 | 0.957 | NA |
| spring2000 | 0.943 | NA |
| summer2000 | 1.03 | 0.943 |
| fall2000 | 0.981 | 0.943 |
| winter2001 | 1.06 | 0.943 |
| spring2001 | 1.05 | 0.943 |
| summer2001 | 1.02 | 1.05 |
| fall2001 | 1.03 | 1.05 |
| winter2002 | 1.02 | 1.05 |
| spring2002 | 1.05 | 1.05 |
回溯2个春季(n=2)
df_n2 <- lag_spring(df, n = 2)
输出结果与需求一致:
| SeasonYear | mean | lag_spring_2 |
|---|---|---|
| winter2000 | 0.957 | NA |
| spring2000 | 0.943 | NA |
| summer2000 | 1.03 | NA |
| fall2000 | 0.981 | NA |
| winter2001 | 1.06 | NA |
| spring2001 | 1.05 | NA |
| summer2001 | 1.02 | 0.943 |
| fall2001 | 1.03 | 0.943 |
| winter2002 | 1.02 | 0.943 |
| spring2002 | 1.05 | 0.943 |
内容的提问来源于stack exchange,提问作者David Smith
相关产品推荐
相关产品推荐

