Pivot one or more values across the columns by one or more keys

stretch(
    data,
    key,
    value,
    sep = "_"
)

Arguments

data

A data.frame.

key

A vector of quoted/unquoted columns, positions, and/or tidyselect::select_helpers whose values will become the column name(s).

value

A vector of quoted/unquoted columns, positions, and/or tidyselect::select_helpers whose values will be spread across the columns.

sep

String to separate keys/values by in the resulting column names. Defaults to "_". Only used when there are more than one keys/values.

Details

In the case of multiple value's, the labels are always appended to the end of the resulting columns.

Value

A tibble::tibble

Author

Alex Zajichek

Examples


#Make a summary table
set.seed(123)
data <- 
  heart_disease %>%
  dplyr::group_by(
    Sex,
    BloodSugar,
    HeartDisease
  ) %>%
  dplyr::summarise(
    Mean = mean(Age),
    SD = sd(Age),
    .groups = "drop"
  ) %>%
  dplyr::mutate(
    Random =
      rbinom(nrow(.), size = 1, prob = .5) %>%
      factor
  )

data %>%
  stretch(
    key = c(BloodSugar, HeartDisease),
    value = c(Mean, SD, Random)
  )
#> # A tibble: 2 × 13
#>   Sex    FALSE_No_Mean FALSE_No_SD FALSE_No_Random FALSE_Yes_Mean FALSE_Yes_SD
#>   <fct>          <dbl>       <dbl> <fct>                    <dbl>        <dbl>
#> 1 Female          54.0       10.4  0                         59.7         3.61
#> 2 Male            50.2        8.82 1                         55.8         8.56
#> # ℹ 7 more variables: FALSE_Yes_Random <fct>, TRUE_No_Mean <dbl>,
#> #   TRUE_No_SD <dbl>, TRUE_No_Random <fct>, TRUE_Yes_Mean <dbl>,
#> #   TRUE_Yes_SD <dbl>, TRUE_Yes_Random <fct>

data %>%
  stretch(
    key = where(is.factor),
    value = where(is.numeric)
  )
#> # A tibble: 2 × 11
#>   BloodSugar Female_No_0_Mean Female_No_0_SD Female_Yes_1_Mean Female_Yes_1_SD
#>   <lgl>                 <dbl>          <dbl>             <dbl>           <dbl>
#> 1 FALSE                  54.0          10.4               59.7            3.61
#> 2 TRUE                   60.3           6.65              57.2            7.81
#> # ℹ 6 more variables: Male_No_1_Mean <dbl>, Male_No_1_SD <dbl>,
#> #   Male_Yes_0_Mean <dbl>, Male_Yes_0_SD <dbl>, Male_Yes_1_Mean <dbl>,
#> #   Male_Yes_1_SD <dbl>

data %>%
  stretch(
    key = c(where(is.factor), where(is.logical)),
    value = where(is.numeric)
  )
#> # A tibble: 1 × 16
#>   Female_No_0_FALSE_Mean Female_No_0_FALSE_SD Female_No_0_TRUE_Mean
#>                    <dbl>                <dbl>                 <dbl>
#> 1                   54.0                 10.4                  60.3
#> # ℹ 13 more variables: Female_No_0_TRUE_SD <dbl>,
#> #   Female_Yes_1_FALSE_Mean <dbl>, Female_Yes_1_FALSE_SD <dbl>,
#> #   Female_Yes_1_TRUE_Mean <dbl>, Female_Yes_1_TRUE_SD <dbl>,
#> #   Male_No_1_FALSE_Mean <dbl>, Male_No_1_FALSE_SD <dbl>,
#> #   Male_No_1_TRUE_Mean <dbl>, Male_No_1_TRUE_SD <dbl>,
#> #   Male_Yes_0_FALSE_Mean <dbl>, Male_Yes_0_FALSE_SD <dbl>,
#> #   Male_Yes_1_TRUE_Mean <dbl>, Male_Yes_1_TRUE_SD <dbl>