如何停止覆盖滞后列?

时间:2015-01-21 06:00:11

标签: r

参考:https://stackoverflow.com/a/28056113/3942806

我正在使用上面链接中的代码为两列创建滞后值。

n<-4
odd2<-setDT(odd)[, paste("OBS_Q", 1:n) := shift(OBS_Q, 1:n)]
odd2<-setDT(odd)[, paste("sac", 1:n) := shift(sac, 1:n)]

这很棒!我得到18列。

但为了方便起见,我尝试将其转换为函数:

masterlag<-function(df,col,n){
   setDT(df)[, paste(col,sep='_',1:n) := shift(df[[col]], 1:n)]
}

odd3<-masterlag(df=odd,col="OBS_Q",n=4)
odd3<-masterlag(df=odd,col="sac",n=4)

但是在这种情况下,当我第二次使用该函数('sac')时,第一个('OBS_Q')的新创建的列将被替换。所以,我只剩下14列而不是18列。

关于为什么的任何指示?

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

1 个答案:

答案 0 :(得分:1)

数据框是自我更新的

odd<-masterlag(df=odd,col="OBS_Q",n=4)
odd<-masterlag(df=odd,col="sac",n=4)