创建具有不同偏移的多个滞后变量

问题描述 投票:0回答:3
我的想法是,我将以四个步骤进行操作:

使用“粘贴”

列的列循环
使用“糊剂”

循环创建滞后列

    cbind
  • 但是我无法继续执行代码。粗糙的东西:
  • 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
  • 我陷入了撰写此功能。你能以某种方式展示吗?或另一种更简单的方法。
  • 报名:rag在r vector/dataframe中的basic滞后
addendum:

真的数据:
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
   } 

要滞后的列是obs_q.

我可能会在base r的

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))

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

也许这样的东西:

r
3个回答
11
投票

如果您正在寻找效率,请尝试新的

shift
功能

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

there您可以为新列(在
paste
)设置任何名称,也无需将其绑定到原始列,因为这是通过使用

9
投票
运算符通过引用来更新数据集。


1)lag.zoo

动物园包中的
lag.zoo
功能可以接受滞后的向量。 在这里,我们想要0个滞后,-1滞后和-2滞后:

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

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

5
投票
那是您的问题,但是您确定那是您想要的吗? 最后三行都具有相同的日期,因此,第四行被滞后到同一日期。

2)头定义一个简单的滞后函数,我们只能使用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)

giving:

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)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.