我正在寻找一个类似于R的函数lag1
,lag2
并retain
在SAS中使用我可以与data.tables一起使用的函数.
我知道R中有类似的功能embed
,lag
但它们不会返回单个值或前一个值.它们返回一组完整的向量.
R中有什么东西我可以用data.table吗?
有关SAS功能的更多信息:
保留
落后
Joris Meys.. 9
您必须意识到R的工作方式与SAS中的数据步骤非常不同.的lag
在SAS功能在数据步骤中使用,并且被用于内数据步骤的隐含的循环结构.这同样适用于对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
对象也适用.这里重要的注意事项是重新思考你的策略:不要像使用SAS中的DATA步骤那样循环思考,而是在使用R时必须开始考虑向量和索引.
您必须意识到R的工作方式与SAS中的数据步骤非常不同.的lag
在SAS功能在数据步骤中使用,并且被用于内数据步骤的隐含的循环结构.这同样适用于对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
对象也适用.这里重要的注意事项是重新思考你的策略:不要像使用SAS中的DATA步骤那样循环思考,而是在使用R时必须开始考虑向量和索引.