Not sure what you are after, but you might just want to use the UPDATE statement for this. Just use the same dataset with zero observations as the BASE dataset to treat all of the observations as TRANSACTIONS.
data want;
update have(obs=0) have;
by id;
run;
If you want the FIRST instead of the LAST then sort the input dataset by ID DESCENDING MEASURE_YEAR
You could also try using the MERGE statement.
data ht;
set have;
where not missing(ht);
by id;
if first.id;
keep id measure_year ht ;
rename measure_year=ht_year;
run;
data wt;
set have;
where not missing(wt);
by id;
if first.id;
keep id measure_year wt ;
rename measure_year=wt_year;
run;
data want;
merge ht wt;
by id;
run;