
Alternative pivoting method for easily pivoting based on name pattern
Source:R/wide2long.R
wide2long.Rd
This function requires and assumes a systematic naming of variables. For now only supports one level pivoting. Adding more levels would require an added "ignore" string pattern or similarly. Example 2.
Usage
wide2long(
data,
pattern,
type = c("prefix", "infix", "suffix"),
id.col = 1,
instance.name = "instance"
)
Examples
data.frame(
1:20, sample(70:80, 20, TRUE),
sample(70:100, 20, TRUE),
sample(70:100, 20, TRUE),
sample(170:200, 20, TRUE)
) |>
setNames(c("id", "age", "weight_0", "weight_1", "height_1")) |>
wide2long(pattern = c("_0", "_1"), type = "suffix")
#> id age instance weight height
#> 1 1 72 0 75 NA
#> 2 1 NA 1 70 185
#> 3 2 77 0 79 NA
#> 4 2 NA 1 86 180
#> 5 3 74 0 95 NA
#> 6 3 NA 1 91 190
#> 7 4 80 0 76 NA
#> 8 4 NA 1 82 175
#> 9 5 72 0 87 NA
#> 10 5 NA 1 91 193
#> 11 6 72 0 88 NA
#> 12 6 NA 1 95 195
#> 13 7 74 0 93 NA
#> 14 7 NA 1 75 197
#> 15 8 72 0 87 NA
#> 16 8 NA 1 81 177
#> 17 9 78 0 92 NA
#> 18 9 NA 1 78 190
#> 19 10 80 0 90 NA
#> 20 10 NA 1 70 176
#> 21 11 76 0 83 NA
#> 22 11 NA 1 93 172
#> 23 12 80 0 92 NA
#> 24 12 NA 1 91 179
#> 25 13 73 0 95 NA
#> 26 13 NA 1 70 170
#> 27 14 73 0 84 NA
#> 28 14 NA 1 98 199
#> 29 15 80 0 98 NA
#> 30 15 NA 1 79 174
#> 31 16 72 0 84 NA
#> 32 16 NA 1 82 174
#> 33 17 77 0 79 NA
#> 34 17 NA 1 88 173
#> 35 18 77 0 98 NA
#> 36 18 NA 1 77 180
#> 37 19 79 0 74 NA
#> 38 19 NA 1 81 178
#> 39 20 79 0 91 NA
#> 40 20 NA 1 80 171
data.frame(
1:20, sample(70:80, 20, TRUE),
sample(70:100, 20, TRUE),
sample(70:100, 20, TRUE),
sample(170:200, 20, TRUE)
) |>
setNames(c("id", "age", "weight_0", "weight_a_1", "height_b_1")) |>
wide2long(pattern = c("_0", "_1"), type = "suffix")
#> id age instance weight weight_a height_b
#> 1 1 79 0 78 NA NA
#> 2 1 NA 1 NA 78 188
#> 3 2 71 0 100 NA NA
#> 4 2 NA 1 NA 89 183
#> 5 3 71 0 85 NA NA
#> 6 3 NA 1 NA 77 188
#> 7 4 75 0 95 NA NA
#> 8 4 NA 1 NA 94 179
#> 9 5 79 0 99 NA NA
#> 10 5 NA 1 NA 72 171
#> 11 6 78 0 76 NA NA
#> 12 6 NA 1 NA 91 185
#> 13 7 76 0 74 NA NA
#> 14 7 NA 1 NA 90 180
#> 15 8 72 0 92 NA NA
#> 16 8 NA 1 NA 96 188
#> 17 9 74 0 76 NA NA
#> 18 9 NA 1 NA 90 193
#> 19 10 70 0 76 NA NA
#> 20 10 NA 1 NA 99 172
#> 21 11 78 0 81 NA NA
#> 22 11 NA 1 NA 85 176
#> 23 12 75 0 81 NA NA
#> 24 12 NA 1 NA 76 199
#> 25 13 75 0 100 NA NA
#> 26 13 NA 1 NA 94 191
#> 27 14 78 0 95 NA NA
#> 28 14 NA 1 NA 79 199
#> 29 15 72 0 71 NA NA
#> 30 15 NA 1 NA 88 192
#> 31 16 77 0 89 NA NA
#> 32 16 NA 1 NA 95 193
#> 33 17 71 0 89 NA NA
#> 34 17 NA 1 NA 72 181
#> 35 18 76 0 94 NA NA
#> 36 18 NA 1 NA 94 197
#> 37 19 79 0 88 NA NA
#> 38 19 NA 1 NA 82 177
#> 39 20 75 0 96 NA NA
#> 40 20 NA 1 NA 85 192
# Optional filling of missing values by last observation carried forward
# Needed for mmrm analyses
long_missings |>
# Fills record ID assuming none are missing
tidyr::fill(record_id) |>
# Grouping by ID for the last step
dplyr::group_by(record_id) |>
# Filling missing data by ID
tidyr::fill(names(long_missings)[!names(long_missings) %in% new_names]) |>
# Remove grouping
dplyr::ungroup()
#> Error: object 'long_missings' not found