我只是想创建一个新列,保留前一个记录中特定列的值,以便我可以将现有列与新列进行比较。我希望能够输出两列中的值不同并且丢失值相同的记录
基本上我希望我的数据集看起来像这样,第一个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;
我搜索了谷歌的高点和低点 - 任何帮助将不胜感激
答案 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;