您必须意识到 R 的工作方式与 SAS 中的数据步骤非常不同。这lag
SAS中的函数在数据步骤中使用,并且使用within该数据步骤的隐式循环结构。这同样适用于retain
函数,它只是在数据循环时保持值不变。
另一方面,R 的工作方式完全矢量化。这意味着您必须重新考虑自己想要做什么,并做出相应的调整。
-
retain
在 R 中根本没用,因为 R 默认情况下会回收参数。如果您想明确执行此操作,您可以查看例如rep()
构造一个具有恒定值和一定长度的向量。
-
lag
是使用索引的问题,并且只是移动向量中所有值的位置。为了保持向量的长度相同,你需要添加一些NA
并删除一些额外的值。
一个简单的例子:这个 SAS 代码滞后于一个变量x
并添加一个变量year
具有恒定值:
data one;
retain year 2013;
input x @@;
y=lag1(x);
z=lag2(x);
datalines;
1 2 3 4 5 6
;
在 R 中,您可以编写自己的滞后函数,如下所示:
mylag <- function(x,k) c(rep(NA,k),head(x,-k))
这一行在向量的开头添加 k 乘以 NA,并从向量中删除最后 k 个值。结果是一个滞后向量,如下所示lag1
SAS 等。
这允许类似的事情:
nrs <- 1:6 # equivalent to datalines
one <- data.frame(
x = nrs,
y = mylag(nrs,1),
z = mylag(nrs,2),
year = 2013 # R automatically loops, so no extra command needed
)
结果是:
> one
x y z year
1 1 NA NA 2013
2 2 1 NA 2013
3 3 2 1 2013
4 4 3 2 2013
5 5 4 3 2013
6 6 5 4 2013
完全相同的情况适用于data.table
目的。这里重要的注意事项是重新考虑您的策略:在使用 R 时,您必须开始考虑向量和索引,而不是像 SAS 中的 DATA 步骤那样进行循环思考。