如何自动创建和延迟时间序列?

时间:2015-01-20 21:59:18

标签: r

我有一个带有列t的数据框。我想创建n个滞后列,其名称类似于t-1,t-2等。

  year      t  t-1 t-2
19620101    1   NA  NA
19630102    2   1   NA
19640103    3   2   1
19650104    4   3   2
19650104    5   4   3
19650104    6   5   4

我的想法是,我将分四步完成:

  • 使用"粘贴"
  • 的列名循环
  • 使用"粘贴"
  • 的滞后列的临时数据帧循环
  • 用于创建滞后列的循环
  • cbind他们。

但我无法继续使用该代码。粗糙的事情:

df_final<-lagged(df="odd",n=3)

lagged<-function(df,n){
   df<-zoo(df)
   lags<-paste("A", 1:n, sep ="_")
   for (i in 1:5) {
     odd<-as.data.frame(lag(odd$OBS_Q,-1*i,na.pad =  TRUE))

   #Cbind here
   } 

我坚持写这个功能。你能表现出来吗?或者另外一种更简单的方法....

参考:Basic lag in R vector/dataframe


附录:

真实数据:

x<-structure(list(DATE = 19630101:19630104, PRECIP = c(0, 0, 0,0), 
               OBS_Q = c(1.61, 1.48, 1.4, 1.33), swb = c(1.75, 1.73, 1.7,1.67), 
               gr4j = c(1.9, 1.77, 1.67, 1.58), isba = c(0.83, 0.83,0.83, 0.83), 
               noah = c(1.31, 1.19, 1.24, 1.31), sac = c(1.99,1.8, 1.66, 1.57), 
               swap = c(1.1, 1.05, 1.08, 0.99), vic.mm.day. = c(2.1,1.75, 1.55, 1.43)), 
          .Names = c("DATE", "PRECIP", "OBS_Q", "swb","gr4j", "isba", "noah", "sac", "swap", "vic.mm.day."), 
          class = c("data.table","data.frame"), row.names = c(NA, -4L))

要滞后的列是OBS_Q。

3 个答案:

答案 0 :(得分:11)

我可以围绕基础R embed()

构建一些东西
x <- c(rep(NA,2),1:6)
embed(x,3)
#      [,1] [,2] [,3]
# [1,]    1   NA   NA
# [2,]    2    1   NA
# [3,]    3    2    1
# [4,]    4    3    2
# [5,]    5    4    3
# [6,]    6    5    4

也许是这样的:

f <- function(x, dimension, pad) {
    if(!missing(pad)) {
        x <- c(rep(pad, dimension-1), x)
    }
    embed(x, dimension)
}
f(1:6, dimension=3, pad=NA)
#      [,1] [,2] [,3]
# [1,]    1   NA   NA
# [2,]    2    1   NA
# [3,]    3    2    1
# [4,]    4    3    2
# [5,]    5    4    3
# [6,]    6    5    4

答案 1 :(得分:7)

如果您正在寻找效率,请尝试development version

中的data.tableshift函数
library(data.table) # V >= 1.9.5
n <- 2
setDT(df)[, paste("t", 1:n) := shift(t, 1:n)][]
#    t t 1 t 2
# 1: 1  NA  NA
# 2: 2   1  NA
# 3: 3   2   1
# 4: 4   3   2
# 5: 5   4   3
# 6: 6   5   4 

您可以在此设置新列的任何名称(在paste内),也不需要将其重新绑定到原始列,因为这会使用:=通过引用更新您的数据集运营商。

答案 2 :(得分:5)

1)lag.zoo 动物园包中的lag.zoo函数可以接受滞后矢量。这里我们想要第0个滞后,-1滞后和-2滞后:

library(zoo)
cbind(DF[-2], coredata(lag(zoo(DF$t), 0:-2)))

,并提供:

      year lag0 lag-1 lag-2
1 19620101    1    NA    NA
2 19630102    2     1    NA
3 19640103    3     2     1
4 19650104    4     3     2
5 19650104    5     4     3
6 19650104    6     5     4

就像你在问题中一样,但你确定那就是你想要的吗?最后三行都具有相同的日期,因此例如第4行滞后于同一日期。

2)head 定义一个简单的Lag函数我们只能使用R的基数:

Lag <- function(x, n = 1) c(rep(NA, n), head(x, -n))  # n > 0

data.frame(DF, `t-1` = Lag(DF$t), `t-2` = Lag(DF$t, 2), check.names = FALSE)

,并提供:

      year t t-1 t-2
1 19620101 1  NA  NA
2 19630102 2   1  NA
3 19640103 3   2   1
4 19650104 4   3   2
5 19650104 5   4   3
6 19650104 6   5   4

注意:我们将此作为数据框使用:

DF <- data.frame(year = c(19620101, 19630102, 19640103, 19650104, 19650104,
                        19650104), t = 1:6)