Maybe something like this will meet your requirements:
proc sql;
create table temp as
select *
from (select distinct a.subject, a.city, a.region, a.city2, a.town, a.sex, a.freqGE,
a.month, a.day, a.year, b.age_in_days from grow a, grow b)
natural full join grow
order by subject, age_in_days;
quit;
data want;
set temp;
by subject age_in_days;
if first.subject then i=0;
else i+1;
if i then do;
age=cats('age',i);
weight=cats('weight',i);
end;
drop i;
run;
Assumptions:
Variable Subject is the primary key and City, Region, City2 (renamed from your second variable named City), Town, Sex, FreqGE (which is missing in all observations), day, month (or rather month, day -- in view of values 2, 25) and year depend only on Subject.
The aim is to create all combinations of subjects with age_in_days values and to keep the pertinent values of weight_in_Kilograms.
Variables age and weight are to be overwritten with values 'age1', 'age2', ... and 'weight1', 'weight2', ..., respectively, reflecting the new ranks of the ordered positive age_in_days values per subject. In the first observation per subject, which has age_in_days=0, the special values age='Initial_age', weight='Initial_weight' are to be maintained.
... View more