【发布时间】:2017-05-10 15:05:25
【问题描述】:
背景:
假设我有这个代码
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 有一些好的(很棒的?)可以提供。
【问题讨论】:
标签: r data.table