我有以下数据,其中家庭中的人按年龄排序(从最老到最年轻):
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多人,我正在寻找更直接的方法.
这是一个两通解决方案.与上述两种解决方案相同的第一步,按年龄排序.在第二步中,跟踪每行的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)