计算组变量中的日期差异,以及缺失观察的行

时间:2015-02-17 20:59:09

标签: sas retain

在SAS中,我有ID,Date1和Date2按升序ID,Date1和Date2排序。排序导致缺少的Date2值根据需要位于它们的位置。如何计算具有有效日期的行之间的Date2差异并获得D_Date2中显示的结果?

单词是:BY ID,跳过Date2中缺少的日期值,读取其下的下一个有效日期,从后面减去较早的日期,并将差值作为D_Date2写入具有有效Date2值的行。感谢。

Obs ID  Date1      Date2        D_Date2
1   1   20090815   20090818       .
2   1   20090815   20090818       0
3   1   20090816   20090820       2
4   1   20090816          .       .
5   1   20090816   20090820       0
6   2   20090101          .       .
7   2   20090105   20090105       .
8   2   20090105          .       .
9   2   20090105   20090106       1
10  2   20090105   20090110       4
11  3   20080720          .       .
12  3   20080720   20080917       .
13  3   20080720   20080918       1
14  3   20081010          .       .
15  3   20081010   20080925       7
16  3   20081010   20080925       0

1 个答案:

答案 0 :(得分:1)

我确定您可以使用retain,但我会使用lag功能。这里的关键是要理解lag函数必须返回上一行的值。如果它遵循if条件,则lag函数返回条件为真的最后一行的值。

为了清晰起见,我喜欢一步一步地做这些事情。首先,我创建一个新变量ldate2,其中包含要减去的日期以获得所需的差异,然后执行减法。

data want;
  set have;
  if not missing(date2) then do;
    ldate2 = lag(date2);
    if id ne lag(id) then ldate2 = .;
  end;
  d_date2 = date2 - ldate2;
run;

正如rbet所建议的,使用dif函数更简单。 dif的行为类似于lag,除了它从当前值中减去前一个值,因此无需单独执行减法:

data want;
  set have;
  if not missing(date2) then do;
    d_date2 = dif(date2);
    if id ne lag(id) then d_date2 = .;
  end;
run;