在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
答案 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;