滞后于R中的data.table,它是时间序列面板数据

时间:2014-07-01 20:56:25

标签: r data.table

我试图使用滞后和数据表符号来滞后变量,因此它是最快的。 这就是我尝试这样做的方式,

head(DT)
setkey(DT,code,year)

输出

     code year pt_N_1y ws_country close is_msci
1: 130104 2003       0     ISRAEL     0       0     
2: 130104 2004       0     ISRAEL     0       0   
3: 130104 2005       0     ISRAEL     0       0    
4: 130104 2006       0     ISRAEL     0       0    
5: 130104 2007       0     ISRAEL     0       0    
6: 130104 2008       0     ISRAEL     0       0   
DT[,L1_is_msci:=.SD[lag(is_msci,1)],by=code]

这会发出50条警告,并提供所有NA个。 Isn&#t; t .SD应该按照"代码"对数据进行子集化。并应用函数lag(is_msci, 1)。 理想情况下,我喜欢使用1行函数来实现滞后,并且希望使用base函数和数据表符号,因为它是处理大型数据集而不安装许多包时最优化的。可能吗?

我想要实现的是

     code year pt_N_1y ws_country close is_msci L1_is_msci
1: 130104 2003       0     ISRAEL     0       0    NA 
2: 130104 2004       0     ISRAEL     0       0    0
3: 130104 2005       0     ISRAEL     0       0    0
4: 130104 2006       0     ISRAEL     0       0    0
5: 130104 2007       0     ISRAEL     0       0    0
6: 130104 2008       0     ISRAEL     0       0    0

1 个答案:

答案 0 :(得分:1)

将来,请提供一个reproducible example - 我们可以从中复制/粘贴代码以获取数据。

我不确定您为lag使用的功能 - 您无法显示它。基函数lag(来自stats)似乎做了不同的事情。如果你正在使用它,难怪你的结果不是你所期望的。测试您正在使用的功能非常容易:

# base function from package stats
lag(1:5, k=1L)
# [1] 1 2 3 4 5
# attr(,"tsp")
# [1] 0 4 1

显然不是我们想要的。所以,让我们编写自己的函数:

lag <- function(x, n)
    if (n == 0) x else c(rep.int(NA, n), head(x, -n))

# test it
lag(1:5, 0)
# [1] 1 2 3 4 5

lag(1:5, 2)
# [1] NA NA  1  2  3

现在,您申请@ eddi的代码:

DT[, L1_is_msci := lag(is_msci, 1L), by = code]
#      code year pt_N_1y ws_country close is_msci L1_is_msci
# 1: 130104 2003       0     ISRAEL     0       0         NA
# 2: 130104 2004       0     ISRAEL     0       0          0
# 3: 130104 2005       0     ISRAEL     0       0          0
# 4: 130104 2006       0     ISRAEL     0       0          0
# 5: 130104 2007       0     ISRAEL     0       0          0
# 6: 130104 2008       0     ISRAEL     0       0          0

HTH