--- title: "networkformat" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{networkformat} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` # Why networkformat? Many R objects contain network structure that isn't in a standard format. Data frames encode relationships between columns — prerequisites, co-occurrences, categorical groupings — that can form graphs. Tree-based models store splits as internal matrices of node indices. Nested lists imply parent-child hierarchies. Getting any of these into a form that igraph, tidygraph, or ggraph can work with typically means writing bespoke reshaping code. **networkformat** does that reshaping for you. It extracts standard **edgelists** (from-to pairs) and **nodelists** (node attributes) from data frames, tree-based models, lists, and vectors, putting everything in the format that the rest of the R network ecosystem expects. # Quick examples The simplest case --- a vector becomes a chain of edges: ```{r vector-quick} library(networkformat) edgelist(c("start", "middle", "end")) nodelist(c("A", "B", "A", "C")) ``` Five lines from tree model to plot: ```{r quick-example, eval = requireNamespace("tree", quietly = TRUE) && requireNamespace("ggraph", quietly = TRUE), fig.width = 9, fig.height = 6, message = FALSE} library(networkformat) library(tidygraph) library(ggraph) tr <- tree::tree(Species ~ Sepal.Length + Sepal.Width, data = iris) tg <- as_tbl_graph(tr) ggraph(tg, layout = "tree") + geom_edge_diagonal(colour = "grey60") + geom_node_label(aes(label = label, fill = ifelse(is_leaf, yval, var)), size = 2.5, colour = "white", fontface = "bold") + scale_fill_brewer(palette = "Set2", name = NULL) + theme_graph(base_family = "sans") + labs(title = "Iris classification tree") ``` # Tabular data networkformat also works with plain data frames. The bundled `courses` dataset has prerequisite and crosslisting relationships: ```{r df-quick} library(networkformat) # Prerequisite edgelist edgelist(courses, source_cols = course, target_cols = prereq) # Node list with course as ID nodelist(courses, id_col = course) ``` # The R network ecosystem Once your data is in edgelist/nodelist form, a large ecosystem of packages is available, including: **igraph** --- the workhorse graph library for R. Handles graph construction, shortest paths, centrality, community detection, clustering, and much more. Also converts to **adjacency matrices** (`as_adjacency_matrix()`) and **incidence matrices** (`as_incidence_matrix()`) for linear algebra approaches. networkformat provides `as.igraph()` methods for tree-based models (`tree`, `rpart`, `randomForest`, `xgb.Booster`, `gbm`), so you can go from model to igraph in one step. **tidygraph** --- a tidy interface built on top of igraph. Lets you manipulate graphs with dplyr verbs (`mutate`, `filter`, `arrange`) while keeping the underlying igraph structure. If you're comfortable with the tidyverse, this is the natural way to work with graphs. networkformat provides `as_tbl_graph()` methods for the same tree-based models, and tidygraph's own `as_tbl_graph.data.frame()` auto-detects edge data frames with `from`/`to` columns --- so once you have an edgelist from networkformat, you can pass it directly to tidygraph as well. **ggraph** --- a ggplot2 extension for graph visualization, designed to work with tidygraph/igraph objects. Supports tree layouts, force-directed layouts, circular layouts, and more. **network** / **statnet** --- an alternative graph ecosystem focused on statistical network modeling (ERGMs, latent space models). igraph objects can be converted to network objects via `intergraph::asNetwork()`. networkformat gets your data into this ecosystem. From there, you can visualize, compute statistics, fit models, or convert to matrices --- whatever your analysis requires. # What's implemented ## Currently available | Input | `edgelist()` | `nodelist()` | `as.igraph()` | |-------|:---:|:---:|:---:| | atomic vector | yes | yes | no | | `list` | yes | yes | no | | `data.frame` | yes | yes | --- | | `tree` | yes | yes | yes | | `randomForest` | yes | yes | yes | | `rpart` | yes | yes | yes | | `xgb.Booster` (xgboost) | yes | yes | yes | | `gbm` | yes | yes | yes | For data frames, tidygraph's `as_tbl_graph()` already handles the conversion from edge data frames to graph objects, so networkformat does not duplicate that method. # Getting started For visualizing tree models quickly, see `vignette("visualization")`. For working directly with edgelists and nodelists --- including all the available arguments and the data frame workflow --- see `vignette("edgelist-nodelist")`.