Please try the proc sql approach
data have;
input Patient $ Visit Variable $ HT WT BI;
cards;
A 1 H 1 . .
A 2 H 3 . .
A 3 H 4 . .
A 1 W . 2 .
A 2 W . 5 .
A 3 W . 9 .
A 1 B . . 0
A 2 B . . 8
A 3 B . . 8
B 1 H 1 . .
B 2 H 3 . .
B 3 H 1 . .
B 1 W . 2 .
B 2 W . 4 .
B 3 W . 1 .
B 1 B . . 0
B 2 B . . 0
B 3 B . . 8
;
proc sql;
create table want as select a.patient,a.visit,a.variable,b.ht,b.wt,b.bi from have as a inner join (select patient,visit,max(ht) as ht, max(wt) as wt, max(bi) as bi from have group by patient, visit) as b on a.patient=b.patient and a.visit=b.visit order by a.patient,a.variable,a.visit;
quit;
... View more