2014-10-16 67 views
1

讓我們假設我有一個名爲W在所述data.frame是2時間順序變量Y和X是從觀察1責令10:生成r多個時滯較短的代碼

Y<- c(1,2,3,4,5,6,7,8,9,10) 
X<- c(11,12,13,14,15,16,17,18,19,20) 
W<- data.frame(Y,X) 

我的目標是創建W的滯後版本下面的代碼工作正常使用移位功能封裝DataCombine:

Wl1<- sapply(W,shift,shiftBy=-1, reminder=FALSE) 
colnames(Wl1)<- paste(colnames(W),".l1",sep="") 

Wl2<- sapply(W,shift,shiftBy=-2, reminder=FALSE) 
colnames(Wl2)<- paste(colnames(W),".l2",sep="") 

Wl3<- sapply(W,shift,shiftBy=-3, reminder=FALSE) 
colnames(Wl3)<- paste(colnames(W),".l3",sep="") 

Wl4<- sapply(W,shift,shiftBy=-4, reminder=FALSE) 
colnames(Wl4)<- paste(colnames(W),".l4",sep="") 

Wl5<- sapply(W,shift,shiftBy=-5, reminder=FALSE) 
colnames(Wl5)<- paste(colnames(W),".l5",sep="") 

Wl6<- sapply(W,shift,shiftBy=-6, reminder=FALSE) 
colnames(Wl6)<- paste(colnames(W),".l6",sep="") 

Wl7<- sapply(W,shift,shiftBy=-7, reminder=FALSE) 
colnames(Wl7)<- paste(colnames(W),".l7",sep="") 

Wl8<- sapply(W,shift,shiftBy=-8, reminder=FALSE) 
colnames(Wl8)<- paste(colnames(W),".l8",sep="") 

Wl9<- sapply(W,shift,shiftBy=-9, reminder=FALSE) 
colnames(Wl9)<- paste(colnames(W),".l9",sep="") 

Wl10<- sapply(W,shift,shiftBy=-10, reminder=FALSE) 
colnames(Wl10)<- paste(colnames(W),".l10",sep="") 

Wlagged<- data.frame(Wl1,Wl2,Wl3,Wl4,Wl5,Wl6,Wl7,Wl8,Wl9,Wl10) 

我需要使這個代碼更緊湊,也不容易出錯的援助。我猜測可以使用某種形式的應用(而不是循環語句),但我還不知道如何更好地使用這些函數。謝謝你們!

+1

這可能是你的情況很好看的不那麼優雅的解決方案:HTTP://adv-r.had。 co.nz/Functional-programming.html – 2014-10-16 21:49:33

回答

3

試試這個:

library(zoo) 

z <- zoo(W) 
lag(z, -(1:10)) 
+0

不錯的選擇,謝謝你介紹我到動物園包。有一件事:當我運行你提交的代碼時,我得到一個從2到10的動物園系列,其中觀察1被丟棄。我希望還保留W的原始數據。有沒有辦法做到這一點,以便我也可以將非滯後數據呈現出來?我們的目標是保留W的原始大小。也許只是寫了一行代碼添加了頂級的NAs? – JMB 2014-10-17 13:57:08

+0

使用'na.pad = TRUE'。請參閱'?zoo.lag' – 2014-10-17 16:22:53

0

這裏只使用基礎R

W[paste0(colnames(W), ".l", rep(seq_len(10), each = 2))] <- 
sapply(seq_len(10), function(x) sapply(W, function(y) c(rep(NA, x), head(y, -x)))) 
W 
#  Y X Y.l1 X.l1 Y.l2 X.l2 Y.l3 X.l3 Y.l4 X.l4 Y.l5 X.l5 Y.l6 X.l6 Y.l7 X.l7 Y.l8 X.l8 Y.l9 X.l9 Y.l10 X.l10 
# 1 1 11 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
# 2 2 12 1 11 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
# 3 3 13 2 12 1 11 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
# 4 4 14 3 13 2 12 1 11 NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
# 5 5 15 4 14 3 13 2 12 1 11 NA NA NA NA NA NA NA NA NA NA NA NA 
# 6 6 16 5 15 4 14 3 13 2 12 1 11 NA NA NA NA NA NA NA NA NA NA 
# 7 7 17 6 16 5 15 4 14 3 13 2 12 1 11 NA NA NA NA NA NA NA NA 
# 8 8 18 7 17 6 16 5 15 4 14 3 13 2 12 1 11 NA NA NA NA NA NA 
# 9 9 19 8 18 7 17 6 16 5 15 4 14 3 13 2 12 1 11 NA NA NA NA 
# 10 10 20 9 19 8 18 7 17 6 16 5 15 4 14 3 13 2 12 1 11 NA NA 
+0

儘管動物園解決方案更短,但我非常感謝這個更長的解決方案。這有助於我更好地瞭解如何編寫更復雜的例程。在sapply中使用sapply就像在for循環中運行for循環一樣? – JMB 2014-10-17 14:02:23

+0

它是相似的,但它並不像外環很小(10次迭代) – 2014-10-18 17:06:43