2015-01-20 39 views
2

我有一個數據幀與列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 

我的想法是,我會做它在四個步驟:

  • 一種循環使用使用「粘貼」
  • 一種用於滯後列臨時dataframes環列名「粘貼」
  • 一個循環創建滯後列
  • cbind他們。

但我無法繼續執行代碼。東西粗糙:

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。

回答

7

如果你正在尋找的效率,儘量data.tableshift函數從development version

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),你也不需要綁定此回原始數據,因爲這會使用:=運算符通過引用更新您的數據集。

+0

我已經安裝data.table,但我仍然收到此錯誤:eval(expr,envir,enclos)中的錯誤:無法找到函數「shift」。任何想法爲什麼? – maximusdooku 2015-01-20 22:31:32

+0

謝謝。但我無法使用它。我試着先安裝devtools。但是我得到這個錯誤:軟件包'devtools'不可用(對於R版本3.0.1)。我正在使用RStudio。 – maximusdooku 2015-01-20 22:33:30

+0

將R版本更新爲新版本,與Rsutio無關。看看[這裏](http://stackoverflow.com/questions/13656699/update-r-using-rstudio)如何。然後,你需要按照提供的鏈接。這是您從Github下載的開發版本。爲簡單起見,打開一個新的R見解並運行'library(devtools); install_github(「Rdatatable/data.table」,build_vignettes = FALSE)'。然後加載您的數據並再次嘗試代碼。 – 2015-01-20 22:34:14

9

我可能會建立一個圍繞基礎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 
+3

你幾乎知道什麼是最好的辦法,不是嗎?哈哈 – 2015-01-20 22:09:19

+0

@RichardScriven - 如果我說「是」,你會相信我嗎? :) – 2015-01-20 22:13:54

+3

由質量來判斷你所有的答案,是的,我會相信你... – 2015-01-20 22:14:52

4

1)lag.zoolag.zoo功能在動物園裏包可以接受的載體滯後。在這裏,我們希望零的滯後性,滯後-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 

這是因爲你有這個問題,但你確定那是你想?最後三行都有相同的日期,所以第四行例如滯後於同一日期。

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) 

捐贈:

 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)