sort_at_path {rtables} | R Documentation |
Sorting a table at a specific path
Description
Main sorting function to order the sub-structure of a TableTree
at a particular path in the table tree.
Usage
sort_at_path(
tt,
path,
scorefun,
decreasing = NA,
na.pos = c("omit", "last", "first"),
.prev_path = character()
)
Arguments
tt |
( |
path |
( |
scorefun |
( |
decreasing |
( |
na.pos |
( |
.prev_path |
( |
Details
sort_at_path
, given a path, locates the (sub)table(s) described by the path (see below for handling of the "*"
wildcard). For each such subtable, it then calls scorefun
on each direct child of the table, using the resulting
scores to determine their sorted order. tt
is then modified to reflect each of these one or more sorting
operations.
In path
, a leading "root"
element will be ignored, regardless of whether this matches the object name (and thus
actual root path name) of tt
. Including "root"
in paths where it does not match the name of tt
may mask deeper
misunderstandings of how valid paths within a TableTree
object correspond to the layout used to originally declare
it, which we encourage users to avoid.
path
can include the "wildcard" "*"
as a step, which translates roughly to any node/branching element and means
that each child at that step will be separately sorted based on scorefun
and the remaining path
entries. This
can occur multiple times in a path.
A list of valid (non-wildcard) paths can be seen in the path
column of the data.frame
created by
formatters::make_row_df()
with the visible_only
argument set to FALSE
. It can also be inferred from the
summary given by table_structure()
.
Note that sorting needs a deeper understanding of table structure in rtables
. Please consider reading the related
vignette
(Sorting and Pruning)
and explore table structure with useful functions like table_structure()
and row_paths_summary()
. It is also
very important to understand the difference between "content" rows and "data" rows. The first one analyzes and
describes the split variable generally and is generated with summarize_row_groups()
, while the second one is
commonly produced by calling one of the various analyze()
instances.
Built-in score functions are cont_n_allcols()
and cont_n_onecol()
. They are both working with content rows
(coming from summarize_row_groups()
) while a custom score function needs to be used on DataRow
s. Here, some
useful descriptor and accessor functions (coming from related vignette):
-
cell_values()
- Retrieves a named list of aTableRow
orTableTree
object's values. -
formatters::obj_name()
- Retrieves the name of an object. Note this can differ from the label that is displayed (if any is) when printing. -
formatters::obj_label()
- Retrieves the display label of an object. Note this can differ from the name that appears in the path. -
content_table()
- Retrieves aTableTree
object's content table (which contains its summary rows). -
tree_children()
- Retrieves aTableTree
object's direct children (either subtables, rows or possibly a mix thereof, though that should not happen in practice).
Value
A TableTree
with the same structure as tt
with the exception that the requested sorting has been done
at path
.
See Also
Score functions
cont_n_allcols()
andcont_n_onecol()
.-
formatters::make_row_df()
andtable_structure()
for pathing information. -
tt_at_path()
to select a table's (sub)structure at a given path.
Examples
# Creating a table to sort
# Function that gives two statistics per table-tree "leaf"
more_analysis_fnc <- function(x) {
in_rows(
"median" = median(x),
"mean" = mean(x),
.formats = "xx.x"
)
}
# Main layout of the table
raw_lyt <- basic_table() %>%
split_cols_by("ARM") %>%
split_rows_by(
"RACE",
split_fun = drop_and_remove_levels("WHITE") # dropping WHITE levels
) %>%
summarize_row_groups() %>%
split_rows_by("STRATA1") %>%
summarize_row_groups() %>%
analyze("AGE", afun = more_analysis_fnc)
# Creating the table and pruning empty and NAs
tbl <- build_table(raw_lyt, DM) %>%
prune_table()
# Peek at the table structure to understand how it is built
table_structure(tbl)
# Sorting only ASIAN sub-table, or, in other words, sorting STRATA elements for
# the ASIAN group/row-split. This uses content_table() accessor function as it
# is a "ContentRow". In this case, we also base our sorting only on the second column.
sort_at_path(tbl, c("ASIAN", "STRATA1"), cont_n_onecol(2))
# Custom scoring function that is working on "DataRow"s
scorefun <- function(tt) {
# Here we could use browser()
sum(unlist(row_values(tt))) # Different accessor function
}
# Sorting mean and median for all the AGE leaves!
sort_at_path(tbl, c("RACE", "*", "STRATA1", "*", "AGE"), scorefun)