Skip to contents

# 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"
    )

## Arguments

data

  data

pattern

  pattern(s) to match. Character vector of length 1 or more.

type

  type of match. can be one of "prefix","infix" or "suffix".

id.col

  ID column. Will fill ID for all. Column name or numeric index. Default is "1", first column.

instance.name

## Value

data.frame

## 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