Как насчет этого:
library(dplyr)
library(stringr)
library(tidyr)
data %>%
gather(key, value, age_5, age_6, age_7, height_5, height_6, height_7) %>%
separate(key, c("key", "obs_time"), "_") %>%
spread(key, value) %>%
mutate(whole_age = floor(age)) %>%
group_by(sex, whole_age) %>%
mutate(htz = scale(height),
sex_init = str_to_lower(str_extract(sex, "^.")),
sa = paste0("htz", sex_init, whole_age)) %>%
ungroup() %>%
spread(sa, htz)
Сначала мы хотели бы привести данные в аккуратный формат.
Для этого мы сначала собираем все столбцы вашего возраста и роста в два столбца: key
и value
. key
затем принимает имя исходной переменной в качестве значения, value
принимает значение в соответствующей переменной, а другие переменные копируются как есть. Данные теперь выглядят так:
# A tibble: 6,000 x 4
child_id sex key value
<int> <fct> <chr> <dbl>
1 1 Male age_5 5.67
2 1 Male age_6 7.02
3 1 Male age_7 8.86
4 1 Male height_5 79.2
5 1 Male height_6 95.8
6 1 Male height_7 85.0
7 2 Male age_5 3.38
8 2 Male age_6 5.06
9 2 Male age_7 5.47
10 2 Male height_5 79.2
# ... with 5,990 more rows
Во-вторых, мы разделяем столбец key
на два столбца: key
и obs_time
, используя «_» в качестве разделителя. Данные теперь выглядят так:
# A tibble: 6,000 x 5
child_id sex key obs_time value
<int> <fct> <chr> <chr> <dbl>
1 1 Male age 5 5.67
2 1 Male age 6 7.02
3 1 Male age 7 8.86
4 1 Male height 5 79.2
5 1 Male height 6 95.8
6 1 Male height 7 85.0
7 2 Male age 5 3.38
8 2 Male age 6 5.06
9 2 Male age 7 5.47
10 2 Male height 5 79.2
# ... with 5,990 more rows
В-третьих, мы разбили значения на две переменные: age
и height
. Данные теперь выглядят так:
# A tibble: 3,000 x 5
child_id sex obs_time age height
<int> <fct> <chr> <dbl> <dbl>
1 1 Male 5 5.67 79.2
2 1 Male 6 7.02 95.8
3 1 Male 7 8.86 85.0
4 2 Male 5 3.38 79.2
5 2 Male 6 5.06 81.8
6 2 Male 7 5.47 102.
7 3 Male 5 5.04 80.4
8 3 Male 6 6.37 95.3
9 3 Male 7 7.01 97.4
10 4 Male 5 6.25 90.8
# ... with 2,990 more rows
В-четвертых, до седьмого мы изменяем возрастную категорию whole_age
, а затем группируем по sex
и whole_age
, чтобы при масштабировании он применялся отдельно для каждой из этих групп. Затем мы выполняем масштабирование в каждой группе, извлекаем первый инициал из sex
и создаем имена переменных, соответствующие только что масштабированным значениям, в одном столбце с именем sa
. Затем мы можем удалить группировку. Данные теперь выглядят так:
# A tibble: 3,000 x 9
child_id sex obs_time age height whole_age htz sex_init sa
<int> <fct> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 1 Male 5 5.67 79.2 5 -0.967 m htzm5
2 1 Male 6 7.02 95.8 7 0.345 m htzm7
3 1 Male 7 8.86 85.0 8 -1.20 m htzm8
4 2 Male 5 3.38 79.2 3 -0.580 m htzm3
5 2 Male 6 5.06 81.8 5 -0.681 m htzm5
6 2 Male 7 5.47 102. 5 1.55 m htzm5
7 3 Male 5 5.04 80.4 5 -0.829 m htzm5
8 3 Male 6 6.37 95.3 6 0.455 m htzm6
9 3 Male 7 7.01 97.4 7 0.529 m htzm7
10 4 Male 5 6.25 90.8 6 -0.0366 m htzm6
# ... with 2,990 more rows
Наконец, мы можем распределить данные в запрошенные вами переменные. И теперь у нас есть:
# A tibble: 3,000 x 32
child_id sex obs_time age height whole_age sex_init htzf0 htzf1 htzf10 htzf11 htzf2 htzf3
<int> <fct> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 Male 5 5.67 79.2 5 m NA NA NA NA NA NA
2 1 Male 6 7.02 95.8 7 m NA NA NA NA NA NA
3 1 Male 7 8.86 85.0 8 m NA NA NA NA NA NA
4 2 Male 5 3.38 79.2 3 m NA NA NA NA NA NA
5 2 Male 6 5.06 81.8 5 m NA NA NA NA NA NA
6 2 Male 7 5.47 102. 5 m NA NA NA NA NA NA
7 3 Male 5 5.04 80.4 5 m NA NA NA NA NA NA
8 3 Male 6 6.37 95.3 6 m NA NA NA NA NA NA
9 3 Male 7 7.01 97.4 7 m NA NA NA NA NA NA
10 4 Male 5 6.25 90.8 6 m NA NA NA NA NA NA
# ... with 2,990 more rows, and 19 more variables: htzf4 <dbl>, htzf5 <dbl>, htzf6 <dbl>,
# htzf7 <dbl>, htzf8 <dbl>, htzf9 <dbl>, htzm0 <dbl>, htzm1 <dbl>, htzm10 <dbl>, htzm11 <dbl>,
# htzm12 <dbl>, htzm2 <dbl>, htzm3 <dbl>, htzm4 <dbl>, htzm5 <dbl>, htzm6 <dbl>, htzm7 <dbl>,
# htzm8 <dbl>, htzm9 <dbl>