背景:
可以說,我有這樣的代碼使用創建滯後列data.table
library(data.table)
#reproducibility
set.seed(45L)
#make table
dt <- data.table(V1=c(1L,2L),
V2=LETTERS[1:3],
V3=round(rnorm(4),4),
V4 = 1:12)
dt
爲此我得到
> dt
V1 V2 V3 V4
1: 1 A 0.3408 1
2: 2 B -0.7033 2
3: 1 C -0.3795 3
4: 2 A -0.7460 4
5: 1 B 0.3408 5
6: 2 C -0.7033 6
7: 1 A -0.3795 7
8: 2 B -0.7460 8
9: 1 C 0.3408 9
10: 2 A -0.7033 10
11: 1 B -0.3795 11
12: 2 C -0.7460 12
,我想創建附加的10列V3的滯後。
問:
是有辦法的「數據表」範例內做到這一點。
更多詳細信息:
如果它是一個data.frame,那麼我可以做一個循環。
dt <- as.data.frame(dt)
for(i in 1:10){
dt <- cbind(dt, shift(x = dt[, 3],
n = i,
fill = NA,
type = "lag"))
names(dt)[ncol(dt)] <- sprintf("lag_%06d",i)
}
dt
爲此,我得到:
> dt
V1 V2 V3 V4 lag_000001 lag_000002 lag_000003 lag_000004 lag_000005 lag_000006 lag_000007 lag_000008 lag_000009 lag_000010
1 1 A 0.3408 1 NA NA NA NA NA NA NA NA NA NA
2 2 B -0.7033 2 0.3408 NA NA NA NA NA NA NA NA NA
3 1 C -0.3795 3 -0.7033 0.3408 NA NA NA NA NA NA NA NA
4 2 A -0.7460 4 -0.3795 -0.7033 0.3408 NA NA NA NA NA NA NA
5 1 B 0.3408 5 -0.7460 -0.3795 -0.7033 0.3408 NA NA NA NA NA NA
6 2 C -0.7033 6 0.3408 -0.7460 -0.3795 -0.7033 0.3408 NA NA NA NA NA
7 1 A -0.3795 7 -0.7033 0.3408 -0.7460 -0.3795 -0.7033 0.3408 NA NA NA NA
8 2 B -0.7460 8 -0.3795 -0.7033 0.3408 -0.7460 -0.3795 -0.7033 0.3408 NA NA NA
9 1 C 0.3408 9 -0.7460 -0.3795 -0.7033 0.3408 -0.7460 -0.3795 -0.7033 0.3408 NA NA
10 2 A -0.7033 10 0.3408 -0.7460 -0.3795 -0.7033 0.3408 -0.7460 -0.3795 -0.7033 0.3408 NA
11 1 B -0.3795 11 -0.7033 0.3408 -0.7460 -0.3795 -0.7033 0.3408 -0.7460 -0.3795 -0.7033 0.3408
12 2 C -0.7460 12 -0.3795 -0.7033 0.3408 -0.7460 -0.3795 -0.7033 0.3408 -0.7460 -0.3795 -0.7033
必須有一個更優雅的方式。能夠更快更高效地處理更大數據的東西。
現在如果我想首先做到這一點,在V3列上做10個滯後,然後在V4上做,而不預設他們的名字。我可以簡單地做嵌套for循環,但我懷疑data.table有一些很好的東西(很好?)在那裏提供。
據透露,沒有必要用包'C函數(F())。= ' – Frank
@Frank,我一直以爲我應該在創建多列時使用'c()''data.table'是否首先檢查'LHS'是否是函數? – mt1022
只有一種情況需要'DT [,x:=]'會爲了方便創建一個名爲'x'的列(不需要用引號括起來,比如'「x」:='),但是這意味着如果你想動態定義'x',被包裹在圓括號中,'x =「col」; DT [,(x):=]'。 – Frank