R 中的保留和滞后函数作为 SAS

2023-11-24

我正在寻找 R 中类似的函数lag1, lag2 and retainSAS 中的函数,我可以将其与 data.tables 一起使用。

我知道有类似的功能embed and lag在 R 中,但它们不返回单个值或先前的值。它们返回一组完整的向量。

R 中有什么可以与 data.table 一起使用的吗?

有关 SAS 功能的更多信息:

  • Retain
  • Lag

您必须意识到 R 的工作方式与 SAS 中的数据步骤非常不同。这lagSAS中的函数在数据步骤中使用,并且使用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 个值。结果是一个滞后向量,如下所示lag1SAS 等。

这允许类似的事情:

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 步骤那样进行循环思考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 中的保留和滞后函数作为 SAS 的相关文章

随机推荐