使用“粘贴”列的列循环
使用“糊剂”
循环创建滞后列
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
真的数据:
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.
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
也许这样的东西:
如果您正在寻找效率,请尝试新的
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
paste
)设置任何名称,也无需将其绑定到原始列,因为这是通过使用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
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)