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

时间:2017-03-29 09:24:45

标签: 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/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;

我搜索了谷歌的高点和低点 - 任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

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

data example2;
    set example1;
    by idr;
    retain date2;
    if first.idr then call missing(date2);
    output;
    date2 = date1;
    format date2 ddmmyy10.;
 run;

在输出语句之后执行的逻辑对刚刚输出的行没有任何影响,但是在数据步骤进行到下一次迭代之前,所有内容仍然在PDV中,包括保留在其中的变量下一行,所以这是一个更新它们的机会。 More details on the 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);

之类的事情,往往会发生奇怪的事情

答案 1 :(得分:0)

要获得最终结果(删除idr和date与上一行相同的记录),您可以轻松实现此目的,而无需创建额外的列。提供数据按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;