In spite of this request being answered already, I'd like to add an answer for the case of missing values, e.g. only shoesize not given for an age_grp/gender pair.
For a solution with joins you would need FULL OUTER JOINs which MySQL doesn't support. And mimicking this with LEFT and /or RIGHT OUTER JOINs can be a pain with several tables.
Here is a solution using UNION ALLs and a final aggregation instead.
create table mytable as
select age_grp, gender, max(height) as height, max(weight) as weight, max(shoesize) as shoesize, max(bmi) as bmi
from
(
select age_grp, gender, height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_1
union all
select age_grp, gender, cast(null as unsigned integer) as height, weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_2
union all
select age_grp, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, shoesize, cast(null as unsigned integer) as bmi from table_3
union all
select age_group, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, bmi from table_4
) x
group by age_grp, gender;
I was surprised that CAST(NULL AS INT) results in a syntax error, btw. I had to change it to CAST(NULL AS UNSIGNED INTEGER).
SQL fiddle: http://www.sqlfiddle.com/#!2/f4fa5c/1.