trav_both_edge {DiagrammeR} | R Documentation |
From a graph object of class
dgr_graph
move to adjacent edges from a
selection of one or more selected nodes, thereby
creating a selection of edges. An optional filter
by edge attribute can limit the set of edges
traversed to.
trav_both_edge(graph, conditions = NULL, copy_attrs_from = NULL, agg = "sum")
graph |
a graph object of class
|
conditions |
an option to use filtering conditions for the traversal. |
copy_attrs_from |
providing a node attribute name will copy those node attribute values to the traversed edges. If the edge attribute already exists, the values will be merged to the traversed edges; otherwise, a new edge attribute will be created. |
agg |
if a node attribute is provided
to |
a graph object of class dgr_graph
.
# Set a seed set.seed(23) # Create a simple graph graph <- create_graph() %>% add_n_nodes( n = 2, type = "a", label = c("asd", "iekd")) %>% add_n_nodes( n = 3, type = "b", label = c("idj", "edl", "ohd")) %>% add_edges_w_string( edges = "1->2 1->3 2->4 2->5 3->5", rel = c(NA, "A", "B", "C", "D")) # Create a data frame with node ID values # representing the graph edges (with `from` # and `to` columns), and, a set of numeric values df <- data.frame( from = c(1, 1, 2, 2, 3), to = c(2, 3, 4, 5, 5), values = round(rnorm(5, 5), 2)) # Join the data frame to the graph's internal # edge data frame (edf) graph <- graph %>% join_edge_attrs(df = df) # Show the graph's internal edge data frame get_edge_df(graph) #> id from to rel values #> 1 1 1 2 <NA> 6.00 #> 2 2 1 3 A 6.11 #> 3 3 2 4 B 4.72 #> 4 4 2 5 C 6.02 #> 5 5 3 5 D 5.05 # Perform a simple traversal from nodes to # adjacent edges with no conditions on the # nodes traversed to graph %>% select_nodes_by_id(nodes = 3) %>% trav_both_edge() %>% get_selection() #> [1] 2 5 # Traverse from node `2` to any adjacent # edges, filtering to those edges that have # NA values for the `rel` edge attribute graph %>% select_nodes_by_id(nodes = 2) %>% trav_both_edge( conditions = is.na(rel)) %>% get_selection() #> [1] 1 # Traverse from node `2` to any adjacent # edges, filtering to those edges that have # numeric values greater than `6.5` for # the `rel` edge attribute graph %>% select_nodes_by_id(nodes = 2) %>% trav_both_edge( conditions = values > 6.5) %>% get_selection() #> [1] 2 # Traverse from node `5` to any adjacent # edges, filtering to those edges that # have values equal to `C` for the `rel` # edge attribute graph %>% select_nodes_by_id(nodes = 5) %>% trav_both_edge( conditions = rel == "C") %>% get_selection() #> [1] 4 # Traverse from node `2` to any adjacent # edges, filtering to those edges that # have values in the set `B` and `C` for # the `rel` edge attribute graph %>% select_nodes_by_id(nodes = 2) %>% trav_both_edge( conditions = rel %in% c("B", "C")) %>% get_selection() #> [1] 3 4 # Traverse from node `2` to any adjacent # edges, and use multiple conditions for the # traversal graph %>% select_nodes_by_id(nodes = 2) %>% trav_both_edge( conditions = rel %in% c("B", "C") & values > 4.0) %>% get_selection() #> [1] 3 4 # Traverse from node `2` to any adjacent # edges, and use multiple conditions with # a single-length vector graph %>% select_nodes_by_id(nodes = 2) %>% trav_both_edge( conditions = rel %in% c("B", "C") | values > 4.0) %>% get_selection() #> [1] 1 3 4 # Traverse from node `2` to any adjacent # edges, and use a regular expression as # a filtering condition graph %>% select_nodes_by_id(nodes = 2) %>% trav_both_edge( conditions = grepl("B|C", rel)) %>% get_selection() #> [1] 3 4 # Create another simple graph to demonstrate # copying of node attribute values to traversed # edges graph <- create_graph() %>% add_path(n = 4) %>% select_nodes_by_id(nodes = 2:3) %>% set_node_attrs_ws( node_attr = value, value = 5) # Show the graph's internal edge data frame graph %>% get_edge_df() #> id from to rel #> 1 1 1 2 <NA> #> 2 2 2 3 <NA> #> 3 3 3 4 <NA> # Show the graph's internal node data frame graph %>% get_node_df() #> id type label value #> 1 1 <NA> 1 NA #> 2 2 <NA> 2 5 #> 3 3 <NA> 3 5 #> 4 4 <NA> 4 NA # Perform a traversal from the nodes to # the adjacent edges while also applying # the node attribute `value` to the edges (in # this case summing the `value` of 5 from # all contributing nodes adding as an edge # attribute) graph <- graph %>% trav_both_edge( copy_attrs_from = value, agg = "sum") # Show the graph's internal edge data frame # after this change graph %>% get_edge_df() #> id from to rel value #> 1 1 1 2 <NA> 5 #> 2 2 2 3 <NA> 10 #> 3 3 3 4 <NA> 5