我有一个带有列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
我的想法是,我将分四步完成:
但我无法继续使用该代码。粗糙的事情:
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。
答案 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.table
新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
内),也不需要将其重新绑定到原始列,因为这会使用:=
通过引用更新您的数据集运营商。
答案 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)