在sas by声明中,从滞后中减去一个观察值

时间:2017-03-21 21:28:32

标签: loops date sas lag

我有一个按群集分组的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; 

任何建议将不胜感激!感谢

2 个答案:

答案 0 :(得分:1)

我喜欢dif(在一个函数中滞后加减法)。我认为你有if first向后,但diflag有相同的限制 - 他们真正在做的是建立一个队列,所以lag或{对于大多数用例,不能有条件地执行{1}}语句。在这里,我翻转它并计算dif,然后在dif上将其设置为缺失。

我还鼓励你对first.cluster dif。

使用缺失而不是0
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。