我有一个按群集分组的SAS数据集,如下所示
data have;
input cluster date date9.;
cards;
1 1JAN2017
1 2JAN2017
1 7JAN2017
2 1JAN2017
2 3JAN2017
2 10JAN2017
;
run;
在每个群集中,我想从它的上一个日期中减去一个日期,所以我有以下数据集:
data want;
input cluster date date_diff;
cards;
1 1JAN2017 0
1 2JAN2017 1
1 7JAN2017 5
2 1JAN2017 0
2 3JAN2017 2
2 10JAN2017 7
;
run;
我想也许我应该使用类似于下面所写的滞后函数。
DATA test;
SET have;
BY cluster;
if first.cluster then do;
date_diff = date - lag(date);
END;
RUN;
任何建议将不胜感激!感谢
答案 0 :(得分:1)
我喜欢dif
(在一个函数中滞后加减法)。我认为你有if first
向后,但dif
和lag
有相同的限制 - 他们真正在做的是建立一个队列,所以lag
或{对于大多数用例,不能有条件地执行{1}}语句。在这里,我翻转它并计算dif
,然后在dif
上将其设置为缺失。
我还鼓励你对first.cluster
dif。
first.cluster
答案 1 :(得分:0)
有条件的滞后是棘手的。在这种情况下(在许多情况下),您实际上并不需要条件延迟。您想要计算每条记录的延迟,然后您可以有条件地使用它。一种方法是:
data want ;
set have ;
by cluster ;
lagdate=lag(date) ;
if first.cluster then date_diff=0 ;
else date_diff=date-lagdate ;
run ;
因此,您为每条记录计算lagdate。然后你可以有条件地计算date_diff。