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

在R中使用nhtemp数据集创建滞后变量数据框失败求助

解决时间序列创建滞后值时列值重复的问题

问题背景

需要基于datasets包的nhtemp时间序列,创建包含1、2、3年滞后值的数据框,预期结构如下:

year      actual_value      lagged_1      lagged_2      lagged_3
1900      1                  NA            NA            NA
1901      2                  1             NA            NA
1902      3                  2             1             NA
1903      4                  3             2             1

但使用stats::lag处理后,滞后列与原列值完全相同,不符合预期。

问题原因

nhtemp是时间序列(ts)对象,stats::lag针对时间序列的核心逻辑是调整时间索引的位置,而非移动数据值。当传入负偏移量(如-1)时,它仅将序列的时间标签向前偏移,数据本身保持不变,因此最终滞后列与原列内容一致。

解决方案

方法1:使用dplyr的lag函数(推荐)

你已经加载了tidyverse,其中dplyr::lag是专门为数据框/向量设计的滞后函数,直接移动数据值,正偏移量对应向后滞后(完全符合需求)。无需重新定义lag <- stats::lag,直接使用即可:

library(tidyverse)

dat <- tibble(
  year = time(nhtemp),
  temp = nhtemp
) %>%
  mutate(
    temp_lag1 = lag(temp, 1),  # 1期滞后:取上一行的temp值
    temp_lag2 = lag(temp, 2),  # 2期滞后:取上两行的temp值
    temp_lag3 = lag(temp, 3)   # 3期滞后:取上三行的temp值
  )

方法2:使用stats::lag(需转换为普通向量)

若一定要用stats::lag,需先将时间序列转换为普通数值向量,此时stats::lag会切换为移动数据值的逻辑(注意:正偏移量对应向前移动数据,正好匹配滞后需求):

library(tidyverse)

# 将时间序列转为普通数值向量
nhtemp_vec <- as.vector(nhtemp)

dat <- tibble(
  year = time(nhtemp),
  temp = nhtemp_vec,
  temp_lag1 = stats::lag(nhtemp_vec, 1),
  temp_lag2 = stats::lag(nhtemp_vec, 2),
  temp_lag3 = stats::lag(nhtemp_vec, 3)
)

验证结果

两种方法生成的数据框都会符合预期:首行的滞后列均为NA,后续行的temp_lagN列依次取前N行的temp值。

内容的提问来源于stack exchange,提问作者Carlos Gómez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:27:48