2015-01-21 98 views
0

參考: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)] 

This works great!我得到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) 

但在這種情況下,第一個(「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

我想你傳遞'odd3'即第二碼。 'masterlag(df = odd3,col =「sac」,n = 4)[]' – akrun 2015-01-21 06:13:59

+0

Ofcourse。愚蠢的我!非常感謝。 – maximusdooku 2015-01-21 06:16:01

+2

我猜這個函數中的'setDT'不會改變原來的'odd'數據集,也就是'masterlag(df = odd,col =「OBS_Q」,n = 4)'如果你檢查'odd',它會是一樣的。 – akrun 2015-01-21 06:19:07

回答

1

的dataframes是自我更新

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