2014-11-04 27 views
1

假設我有一個數據表。我可以創建滯後值的列:如何將數據表值減少一個以上

>x 
date id val valPr 
1/4/14 a 1  2 
1/3/14 a 2  3 
1/2/14 a 3  4 
1/1/14 a 4  NA 
1/4/14 b 10 20 
1/3/14 b 20 30 
1/2/14 b 30 40 
1/1/14 b 40 NA 

使用:

setDT(x)[, valPr := c(val[-1], NA), by = "id"] 

有沒有辦法做同樣的事情由一個以上的週期滯後?三個例子?

它會產生這樣的:

>x 
date id val valPr 
1/4/14 a 1  4 
1/3/14 a 2  NA 
1/2/14 a 3  NA 
1/1/14 a 4  NA 
1/4/14 b 10 40 
1/3/14 b 20 NA 
1/2/14 b 30 NA 
1/1/14 b 40 NA 
+0

如果你使用'dplyr'這樣的事情對你的作品。 %x%>%group_by(id)%>%mutate(valPr2 = lead(val,3))''。所以,你可能想嘗試像'setDT(x)[,valPr2:= lead(val,3),by =「id」]'? – jazzurro 2014-11-04 23:47:24

+1

或者只是寫一個'lead'函數 - [見這裏](http://stackoverflow.com/a/24557781/559784)。也許我們應該提供滯後/領導功能,相當普遍。 – Arun 2014-11-05 01:40:59

回答

2

您可以選擇執行以下操作。 leaddplyr中的一項功能。

setDT(mydf)[, valPr2 := lead(val, 3), by = "id"] 

#  date id val valPr valPr2 
#1: 1/4/14 a 1  2  4 
#2: 1/3/14 a 2  3  NA 
#3: 1/2/14 a 3  4  NA 
#4: 1/1/14 a 4 NA  NA 
#5: 1/4/14 b 10 20  40 
#6: 1/3/14 b 20 30  NA 
#7: 1/2/14 b 30 40  NA 
#8: 1/1/14 b 40 NA  NA 

DATA

mydf <- structure(list(date = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 
1L), .Label = c("1/1/14", "1/2/14", "1/3/14", "1/4/14"), class = "factor"), 
id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("a", 
"b"), class = "factor"), val = c(1L, 2L, 3L, 4L, 10L, 20L, 
30L, 40L), valPr = c(2L, 3L, 4L, NA, 20L, 30L, 40L, NA)), .Names = c("date", 
"id", "val", "valPr"), class = "data.frame", row.names = c(NA, 
-8L)) 
2

隨着data.table,你會做這樣的:

nlags = 3 x[ by="id", , valPr := c(val[ - seq(nlags) ], rep(NA, nlags)) ]

這樣做是取代了第一nlagsval,然後把最後的數值爲NA。您可以調整它以輕鬆將滯後的值放在系列的開頭或結尾。