我试图使用滞后和数据表符号来滞后变量,因此它是最快的。 这就是我尝试这样做的方式,
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
答案 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