
List Processing
list-processing.Rdcollapse provides the following set of functions to efficiently work with lists of R objects:
Search and Identification
is_unlistablechecks whether a (nested) list is composed of atomic objects in all final nodes, and thus unlistable to an atomic vector usingunlist.ldepthdetermines the level of nesting of the list (i.e. the maximum number of nodes of the list-tree).has_elemsearches elements in a list using element names, regular expressions applied to element names, or a function applied to the elements, and returnsTRUEif any matches were found.
Subsetting
atomic_elemexamines the top-level of a list and returns a sublist with the atomic elements. Converselylist_elemreturns the sublist of elements which are themselves lists or list-like objects.reg_elemandirreg_elemare recursive versions of the former.reg_elemextracts the 'regular' part of the list-tree leading to atomic elements in the final nodes, whileirreg_elemextracts the 'irregular' part of the list tree leading to non-atomic elements in the final nodes. (Tip: try calling both on anlmobject). Naturally for all listsl,is_unlistable(reg_elem(l))evaluates toTRUE.get_elemextracts elements from a list using element names, regular expressions applied to element names, a function applied to the elements, or element-indices used to subset the lowest-level sub-lists. by default the result is presented as a simplified list containing all matching elements. With thekeep.treeoption howeverget_elemcan also be used to subset lists i.e. maintain the full tree but cut off non-matching branches.
Splitting and Transposition
rsplitrecursively splits a vector or data frame into subsets according to combinations of (multiple) vectors / factors - by default returning a (nested) list. Ifflatten = TRUE, the list is flattened yielding the same result assplit.rsplitis also faster thansplit, particularly for data frames.t_listefficiently transposes nested lists of lists, such as those obtained from splitting a data frame by multiple variables usingrsplit.
Apply Functions
Unlisting / Row-Binding
unlist2defficiently unlists unlistable lists in 2-dimensions and creates a data frame (or data.table) representation of the list. This is done by recursively flattening and row-binding R objects in the list while creating identifier columns for each level of the list-tree and (optionally) saving the row-names of the objects in a separate column.unlist2dcan thus also be understood as a recursive generalization ofdo.call(rbind, l), for lists of vectors, data frames, arrays or heterogeneous objects. A simpler version for non-recursive row-binding lists of lists / data.frames, is also available byrowbind.
Table of Functions
| Function | Description | |
is_unlistable | Checks if list is unlistable | |
ldepth | Level of nesting / maximum depth of list-tree | |
has_elem | Checks if list contains a certain element | |
get_elem | Subset list / extract certain elements | |
atomic_elem | Top-level subset atomic elements | |
list_elem | Top-level subset list/list-like elements | |
reg_elem | Recursive version of atomic_elem: Subset / extract 'regular' part of list | |
irreg_elem | Subset / extract non-regular part of list | |
rsplit | Recursively split vectors or data frames / lists | |
t_list | Transpose lists of lists | |
rapply2d | Recursively apply functions to lists of data objects | |
unlist2d | Recursively unlist/row-bind lists of data objects in 2D, to data frame or data.table | |
rowbind | Non-recursive binding of lists or lists / data.frames. |