计算分组行之间的最大差异

use*_*648 1 sas

我有以下数据,其中家庭中的人按年龄排序(从最老到最年轻):

data houses;             
input HouseID PersonID Age;       
datalines;              
1 1 25                    
1 2 20                   
2 1 32
2 2 16
2 3 14
2 4 12
3 1 44
3 2 42
3 3 10
3 4 5
;
run;
Run Code Online (Sandbox Code Playgroud)

我想为每个家庭计算连续老年人之间的最大年龄差异.因此,该示例将连续为家庭1,2和3给出5(= 25-20),16(= 32-16)和32(= 42-10)的值.

我可以使用大量合并(即提取人1,与人2的提取物合并,等等)来做到这一点,但由于家庭中可能有多达20多人,我正在寻找更直接的方法.

Ree*_*eza 6

这是一个两通解决方案.与上述两种解决方案相同的第一步,按年龄排序.在第二步中,跟踪每行的max_diff,在HouseID的最后一条记录中输出结果.这导致只有两次通过数据.

proc sort data=houses; by houseid age;run;

data want;
set houses;
by houseID;

retain max_diff 0;

diff = dif1(age)*-1;

if first.HouseID then do;
    diff = .; max_diff=.;
end;

if diff>max_diff then max_diff=diff;
if last.houseID then output;

keep houseID max_diff;
run; 
Run Code Online (Sandbox Code Playgroud)