在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
相关产品推荐
相关产品推荐

