SAS Retain语句-如何将以前未丢失的值保留到新列中进行比较

SAS Retain语句-如何将以前未丢失的值保留到新列中进行比较,sas,retain,Sas,Retain,我只是想创建一个新列,保留前一条记录中特定列的值,以便将现有列与新列进行比较。接下来,我希望能够输出两列中的值不同的记录,并丢失值相同的记录 基本上,我希望我的数据集如下所示,其中第一个idr的保留日期设置为null: Idr Date1 Date2 1 20/01/2016 . 1 20/01/2016 20/01/2016 1 18/10/2016 20/01/2016 2 07/03/2016 . 2 18/05/2016 07/03/20

我只是想创建一个新列,保留前一条记录中特定列的值,以便将现有列与新列进行比较。接下来,我希望能够输出两列中的值不同的记录,并丢失值相同的记录

基本上,我希望我的数据集如下所示,其中第一个idr的保留日期设置为null:

Idr Date1           Date2
1   20/01/2016  .
1   20/01/2016  20/01/2016
1   18/10/2016  20/01/2016
2   07/03/2016  .
2   18/05/2016  07/03/2016
2   21/10/2016  18/05/2016
3   29/01/2016  . 
3   04/02/2016  29/01/2016
3   04/02/2016  04/02/2016
我在过去使用过以下代码,其中我创建了一个临时变量,引用了我想要保留的数据:

date_temp=date1;
    data example2;
    set example1;
    by idr date1;
    date_temp=date1;
retain date_temp ;
    if first.idr then do;
        date_temp=date1;
    end;else do;
        date2=date_temp;
    end;
 run;

我已经搜索了google的高低-如果有任何帮助,我将不胜感激。

这里的诀窍是在输出当前行后设置保留变量的值,而不是依赖于数据步骤结束时的默认隐式输出:

data example2;
    set example1;
    by idr;
    retain date2;
    if first.idr then call missing(date2);
    output;
    date2 = date1;
    format date2 ddmmyy10.;
 run;
在output语句之后执行的逻辑不会对刚输出的行产生任何影响,但在数据步骤进入下一个迭代之前,所有内容都仍然在PDV中,包括保留到下一行的变量,因此这是一个更新它们的机会

另一种方法是使用
lag
功能:

data example3;
    set example1;
    date2 = lag(date1);
    if idr ne lag(idr) then call missing(date2);
run;

使用
lag
时要小心-它返回上次在数据步骤中执行
lag
函数实例时的值,而不一定是前一行中该变量的值,因此如果执行类似
if condition then mylaggedvar=lag(var)的操作,则会发生奇怪的事情

这里的诀窍是在输出当前行后,设置保留变量的值,为下一行做好准备,而不是依赖于数据步骤结束时的默认隐式输出:

data example2;
    set example1;
    by idr;
    retain date2;
    if first.idr then call missing(date2);
    output;
    date2 = date1;
    format date2 ddmmyy10.;
 run;
在output语句之后执行的逻辑不会对刚输出的行产生任何影响,但在数据步骤进入下一个迭代之前,所有内容都仍然在PDV中,包括保留到下一行的变量,因此这是一个更新它们的机会

另一种方法是使用
lag
功能:

data example3;
    set example1;
    date2 = lag(date1);
    if idr ne lag(idr) then call missing(date2);
run;

使用
lag
时要小心-它返回上次在数据步骤中执行
lag
函数实例时的值,而不一定是前一行中该变量的值,因此如果执行类似
if condition then mylaggedvar=lag(var)的操作,则会发生奇怪的事情

要实现最终结果(删除idr和日期与前一行相同的记录),无需创建额外列即可轻松实现。提供按idr和date1排序的数据,然后只需使用
first.date1
保存所需的记录

data have;
input Idr Date1 :ddmmyy10.;
format date1 ddmmyy10.;
datalines;
1   20/01/2016
1   20/01/2016
1   18/10/2016
2   07/03/2016
2   18/05/2016
2   21/10/2016
3   29/01/2016
3   04/02/2016
3   04/02/2016
;
run;

data want;
set have;
by idr date1;
if first.date1 then output;
run;

要实现最终结果(删除idr和日期与前一行相同的记录),无需创建额外列即可轻松实现。提供按idr和date1排序的数据,然后只需使用
first.date1
保存所需的记录

data have;
input Idr Date1 :ddmmyy10.;
format date1 ddmmyy10.;
datalines;
1   20/01/2016
1   20/01/2016
1   18/10/2016
2   07/03/2016
2   18/05/2016
2   21/10/2016
3   29/01/2016
3   04/02/2016
3   04/02/2016
;
run;

data want;
set have;
by idr date1;
if first.date1 then output;
run;

你好-谢谢你的回复。滞后函数工作得很好!我也尝试了你提到的第一种方法,但是没有任何运气。。我遵循您尝试执行的逻辑,但是我始终认为SAS处理命令的方式是,一旦指定了输出语句,它就不能再处理任何命令了?关于为什么这不起作用还有什么建议吗?我已经用你的数据测试了第一种方法,它产生了你想要的输出。有什么问题?@user667489,如果在第一个示例代码中删除显式输出语句,会有区别吗?@Alph-是的。试试看!@用户667489,它看到了变化。您能给我一个例子吗?在这个例子中,不使用输出语句,但重置保留变量,以便在可能的情况下将当前观察值与以前的观察值进行比较?谢谢你好-谢谢你的回复。滞后函数工作得很好!我也尝试了你提到的第一种方法,但是没有任何运气。。我遵循您尝试执行的逻辑,但是我始终认为SAS处理命令的方式是,一旦指定了输出语句,它就不能再处理任何命令了?关于为什么这不起作用还有什么建议吗?我已经用你的数据测试了第一种方法,它产生了你想要的输出。有什么问题?@user667489,如果在第一个示例代码中删除显式输出语句,会有区别吗?@Alph-是的。试试看!@用户667489,它看到了变化。您能给我一个例子吗?在这个例子中,不使用输出语句,但重置保留变量,以便在可能的情况下将当前观察值与以前的观察值进行比较?谢谢你好,谢谢你的回复。我遵循您的方法,但是我需要另一列来创建其他变量,如两个日期之间的天数/月数等。最终,我将进入删除date1=date2的记录的阶段,但在此期间,我将使用它们来完成每个idr的计数等。好的,没问题。然后一定要查看
dif
函数。这类似于
lag
,但会计算当前值和以前值之间的差值。感谢您的回复。我遵循您的方法,但是我需要另一列来创建其他变量,如两个日期之间的天数/月数等。最终,我将进入删除date1=date2的记录的阶段,但在此期间,我将使用它们来完成每个idr的计数等。好的,没问题。然后一定要查看
dif
函数。这类似于
滞后
,但计算当前和p之间的差异