behead {unpivotr} | R Documentation |
Strip a level of headers from a pivot table
Description
behead()
takes one level of headers from a pivot table and
makes it part of the data. Think of it like tidyr::gather()
, except that
it works when there is more than one row of headers (or more than one column
of row-headers), and it only works on tables that have first come through
as_cells()
or tidyxl::xlsx_cells()
.
Usage
behead(
cells,
direction,
name,
values = NULL,
types = data_type,
formatters = list(),
drop_na = TRUE
)
behead_if(
cells,
...,
direction,
name,
values = NULL,
types = data_type,
formatters = list(),
drop_na = TRUE
)
Arguments
cells |
Data frame. The cells of a pivot table, usually the output of
|
direction |
The direction between a data cell and its header, one of
|
name |
A name to give the new column that will be created, e.g.
|
values |
Optional. The column of |
types |
The name of the column that names the data type of each cell.
Usually called |
formatters |
A named list of functions for formatting each data type in
a set of headers of mixed data types, e.g. when some headers are dates and
others are characters. These can be given as |
drop_na |
logical Whether to filter out headers that have |
... |
Passed to dplyr::filter. logical predicates defined in terms of
the variables in The arguments in |
Value
A data frame
Examples
# A simple table with a row of headers
(x <- data.frame(a = 1:2, b = 3:4))
# Make a tidy representation of each cell
(cells <- as_cells(x, col_names = TRUE))
# Strip the cells in row 1 (the original headers) and use them as data
behead(cells, "N", foo)
# More complex example: pivot table with several layers of headers
(x <- purpose$`up-left left-up`)
# Make a tidy representation
cells <- as_cells(x)
head(cells)
tail(cells)
# Strip the headers and make them into data
tidy <-
cells %>%
behead("up-left", Sex) %>%
behead("up", `Sense of purpose`) %>%
behead("left-up", `Highest qualification`) %>%
behead("left", `Age group (Life-stages)`) %>%
dplyr::mutate(count = as.integer(chr)) %>%
dplyr::select(-row, -col, -data_type, -chr)
head(tidy)
# Check against the provided 'tidy' version of the data.
dplyr::anti_join(tidy, purpose$Tidy)
# The provided 'tidy' data is missing a row for Male 15-24-year-olds with a
# postgraduate qualification and a sense of purpose between 0 and 6. That
# seems to have been an oversight by Statistics New Zealand.
cells <- tibble::tribble(
~X1, ~adult, ~juvenile,
"LION", 855, 677,
"male", 496, 322,
"female", 359, 355,
"TIGER", 690, 324,
"male", 381, 222,
"female", 309, 102
)
cells <- as_cells(cells, col_names = TRUE)
cells %>%
behead_if(chr == toupper(chr), direction = "left-up", name = "species") %>%
behead("left", "sex") %>%
behead("up", "age") %>%
dplyr::select(species, sex, age, population = dbl)