This is a low level interface to pivotting, inspired by the cdata package, that allows you to describe pivotting with a data frame.

pivot_longer_spec(
data,
spec,
names_repair = "check_unique",
values_drop_na = FALSE,
values_ptypes = list(),
values_transform = list()
)

build_longer_spec(
data,
cols,
names_to = "name",
values_to = "value",
names_prefix = NULL,
names_sep = NULL,
names_pattern = NULL,
names_ptypes = NULL,
names_transform = NULL
)

## Arguments

data A data frame to pivot. A specification data frame. This is useful for more complex pivots because it gives you greater control on how metadata stored in the column names turns into columns in the result. Must be a data frame containing character .name and .value columns. Additional columns in spec should be named to match columns in the long format of the dataset and contain values corresponding to columns pivoted from the wide format. The special .seq variable is used to disambiguate rows internally; it is automatically removed after pivotting. What happens if the output has invalid column names? The default, "check_unique" is to error if the columns are duplicated. Use "minimal" to allow duplicates in the output, or "unique" to de-duplicated by adding numeric suffixes. See vctrs::vec_as_names() for more options. If TRUE, will drop rows that contain only NAs in the value_to column. This effectively converts explicit missing values to implicit missing values, and should generally be used only when missing values in data were created by its structure. A list of column name-prototype pairs. A prototype (or ptype for short) is a zero-length vector (like integer() or numeric()) that defines the type, class, and attributes of a vector. Use these arguments if you want to confirm that the created columns are the types that you expect. Note that if you want to change (instead of confirm) the types of specific columns, you should use names_transform or values_transform instead. A list of column name-function pairs. Use these arguments if you need to change the types of specific columns. For example, names_transform = list(week = as.integer) would convert a character variable called week to an integer. If not specified, the type of the columns generated from names_to will be character, and the type of the variables generated from values_to will be the common type of the input columns used to generate them. <tidy-select> Columns to pivot into longer format. A string specifying the name of the column to create from the data stored in the column names of data. Can be a character vector, creating multiple columns, if names_sep or names_pattern is provided. In this case, there are two special values you can take advantage of: NA will discard that component of the name. .value indicates that component of the name defines the name of the column containing the cell values, overriding values_to. A string specifying the name of the column to create from the data stored in cell values. If names_to is a character containing the special .value sentinel, this value will be ignored, and the name of the value column will be derived from part of the existing column names. A regular expression used to remove matching text from the start of each variable name. If names_to contains multiple values, these arguments control how the column name is broken up. names_sep takes the same specification as separate(), and can either be a numeric vector (specifying positions to break on), or a single string (specifying a regular expression to split on). names_pattern takes the same specification as extract(), a regular expression containing matching groups (()). If these arguments do not give you enough control, use pivot_longer_spec() to create a spec object and process manually as needed. If names_to contains multiple values, these arguments control how the column name is broken up. names_sep takes the same specification as separate(), and can either be a numeric vector (specifying positions to break on), or a single string (specifying a regular expression to split on). names_pattern takes the same specification as extract(), a regular expression containing matching groups (()). If these arguments do not give you enough control, use pivot_longer_spec() to create a spec object and process manually as needed. A list of column name-prototype pairs. A prototype (or ptype for short) is a zero-length vector (like integer() or numeric()) that defines the type, class, and attributes of a vector. Use these arguments if you want to confirm that the created columns are the types that you expect. Note that if you want to change (instead of confirm) the types of specific columns, you should use names_transform or values_transform instead. A list of column name-function pairs. Use these arguments if you need to change the types of specific columns. For example, names_transform = list(week = as.integer) would convert a character variable called week to an integer. If not specified, the type of the columns generated from names_to will be character, and the type of the variables generated from values_to will be the common type of the input columns used to generate them.

## Examples

# See vignette("pivot") for examples and explanation

# Use build_longer_spec() to build spec using similar syntax to pivot_longer()
# and run pivot_longer_spec() based on spec.
spec <- relig_income %>% build_longer_spec(
cols = !religion,
names_to = "income",
values_to = "count"
)
spec
#> # A tibble: 10 × 3
#>    .name              .value income
#>    <chr>              <chr>  <chr>
#>  1 <$10k count <$10k
#>  2 $10-20k count$10-20k
#>  3 $20-30k count$20-30k
#>  4 $30-40k count$30-40k
#>  5 $40-50k count$40-50k
#>  6 $50-75k count$50-75k
#>  7 $75-100k count$75-100k
#>  8 $100-150k count$100-150k
#>  9 >150k              count  >150k
#> 10 Don't know/refused count  Don't know/refused
pivot_longer_spec(relig_income, spec)
#> # A tibble: 180 × 3
#>    religion income             count
#>    <chr>    <chr>              <dbl>
#>  1 Agnostic <$10k 27 #> 2 Agnostic$10-20k               34
#>  3 Agnostic $20-30k 60 #> 4 Agnostic$30-40k               81
#>  5 Agnostic $40-50k 76 #> 6 Agnostic$50-75k              137
#>  7 Agnostic $75-100k 122 #> 8 Agnostic$100-150k            109
#>  9 Agnostic >150k                 84
#> 10 Agnostic Don't know/refused    96
#> # … with 170 more rows
# Is equivalent to:
relig_income %>% pivot_longer(
cols = !religion,
names_to = "income",
values_to = "count")
#> # A tibble: 180 × 3
#>    religion income             count
#>    <chr>    <chr>              <dbl>
#>  1 Agnostic <$10k 27 #> 2 Agnostic$10-20k               34
#>  3 Agnostic $20-30k 60 #> 4 Agnostic$30-40k               81
#>  5 Agnostic $40-50k 76 #> 6 Agnostic$50-75k              137
#>  7 Agnostic $75-100k 122 #> 8 Agnostic$100-150k            109
#>  9 Agnostic >150k                 84
#> 10 Agnostic Don't know/refused    96
#> # … with 170 more rows