Convert from TALL dataset to WIDE

library(readr)
long1 <- read_csv("long1.csv")
## Rows: 22 Columns: 4
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (4): id, time, bmi, satis
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
long1
id time bmi satis
1 1 28.0 6
1 2 27.6 7
1 3 27.4 8
2 1 33.4 7
2 2 33.5 7
2 3 33.2 6
3 1 23.4 8
3 2 23.3 9
3 3 24.5 8
4 1 25.6 6
4 3 26.6 8
5 1 29.0 5
6 1 30.0 7
6 2 31.2 7
6 3 30.5 8
7 1 33.2 7
8 1 34.4 8
9 1 26.6 7
9 2 26.4 8
10 1 25.5 8
10 2 25.7 7
10 3 24.9 9
library(tidyr)
long1_to_wide <- long1 %>%
  tidyr::pivot_wider(id_cols = id,
                     names_from = time,
                     values_from = c(bmi, satis))

long1_to_wide
id bmi_1 bmi_2 bmi_3 satis_1 satis_2 satis_3
1 28.0 27.6 27.4 6 7 8
2 33.4 33.5 33.2 7 7 6
3 23.4 23.3 24.5 8 9 8
4 25.6 NA 26.6 6 NA 8
5 29.0 NA NA 5 NA NA
6 30.0 31.2 30.5 7 7 8
7 33.2 NA NA 7 NA NA
8 34.4 NA NA 8 NA NA
9 26.6 26.4 NA 7 8 NA
10 25.5 25.7 24.9 8 7 9

Go from WIDE to LONG

wide1 <- read_csv("wide1.csv")
## Rows: 10 Columns: 7
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (7): id, bmi1, bmi2, bmi3, satis1, satis2, satis3
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
wide1
id bmi1 bmi2 bmi3 satis1 satis2 satis3
1 28.0 27.6 27.4 6 7 8
2 33.4 33.5 33.2 7 7 6
3 23.4 23.3 24.5 8 9 8
4 25.6 NA 26.6 6 NA 8
5 29.0 NA NA 5 NA NA
6 30.0 31.2 30.5 7 7 8
7 33.2 NA NA 7 NA NA
8 34.4 NA NA 8 NA NA
9 26.6 26.4 NA 7 8 NA
10 25.5 25.7 24.9 8 7 9
wide1_to_long1 <- wide1 %>%
  tidyr::pivot_longer(cols = bmi1:satis3)

wide1_to_long1 
id name value
1 bmi1 28.0
1 bmi2 27.6
1 bmi3 27.4
1 satis1 6.0
1 satis2 7.0
1 satis3 8.0
2 bmi1 33.4
2 bmi2 33.5
2 bmi3 33.2
2 satis1 7.0
2 satis2 7.0
2 satis3 6.0
3 bmi1 23.4
3 bmi2 23.3
3 bmi3 24.5
3 satis1 8.0
3 satis2 9.0
3 satis3 8.0
4 bmi1 25.6
4 bmi2 NA
4 bmi3 26.6
4 satis1 6.0
4 satis2 NA
4 satis3 8.0
5 bmi1 29.0
5 bmi2 NA
5 bmi3 NA
5 satis1 5.0
5 satis2 NA
5 satis3 NA
6 bmi1 30.0
6 bmi2 31.2
6 bmi3 30.5
6 satis1 7.0
6 satis2 7.0
6 satis3 8.0
7 bmi1 33.2
7 bmi2 NA
7 bmi3 NA
7 satis1 7.0
7 satis2 NA
7 satis3 NA
8 bmi1 34.4
8 bmi2 NA
8 bmi3 NA
8 satis1 8.0
8 satis2 NA
8 satis3 NA
9 bmi1 26.6
9 bmi2 26.4
9 bmi3 NA
9 satis1 7.0
9 satis2 8.0
9 satis3 NA
10 bmi1 25.5
10 bmi2 25.7
10 bmi3 24.9
10 satis1 8.0
10 satis2 7.0
10 satis3 9.0

This code uses “regular expressions” to parse the “patterns” of variable names.

This is my guess of why/how this works…

Learn more with these cheatsheets on “regex”:

Also see:

wide1_to_long2 <- wide1 %>%
  tidyr::pivot_longer(cols = bmi1:satis3,
                      names_to = c(".value", "time"),
                      names_pattern = "(.+)(.+)")

wide1_to_long2
id time bmi satis
1 1 28.0 6
1 2 27.6 7
1 3 27.4 8
2 1 33.4 7
2 2 33.5 7
2 3 33.2 6
3 1 23.4 8
3 2 23.3 9
3 3 24.5 8
4 1 25.6 6
4 2 NA NA
4 3 26.6 8
5 1 29.0 5
5 2 NA NA
5 3 NA NA
6 1 30.0 7
6 2 31.2 7
6 3 30.5 8
7 1 33.2 7
7 2 NA NA
7 3 NA NA
8 1 34.4 8
8 2 NA NA
8 3 NA NA
9 1 26.6 7
9 2 26.4 8
9 3 NA NA
10 1 25.5 8
10 2 25.7 7
10 3 24.9 9