If the data are sorted by subject (but can have any order within subject), then the DATA step solution is the most tempting:
data have;
input Subject & $15. Office & $15. Date Value ;
cards;
Patient 1 Visit 1 12 20
Patient 1 Followup 2 4 35
Patient 1 Followup 2 2 54
Patient 1 Followup 3 3 29
Patient 1 Followup 3 11 13
Patient 1 Followup 3 5 98
;
data want (drop=base_value);
merge have (keep=subject office value where=(office='Visit 1') rename=(value=base_value))
have;
by subject;
if office='Visit 1' then output=value;
else output=value-base_value;
run;
This assumes that each subject has exactly one "Visit 1" record.