Reputation: 303
It should be very simple, but I am stuck in this operation. I am interested in extracting the block Edge Data: 23,502 x 3. And to indicate the names of the nodes. In short, I need to know the weight of each pair of nodes by their names.
Code:
# A tbl_graph: 11539 nodes and 23502 edges
#
# An undirected simple graph with 2493 components
#
# Node Data: 11,539 x 3 (active)
name neighbors groups
<chr> <dbl> <int>
1 CHANSATITPORN N 1 1540
2 POBKEEREE V 1 1540
3 SAINIS G 4 361
4 HARITOS G 4 361
5 KRIEMADIS T 4 361
6 PAPASOLOMOU I 3 361
# … with 11,533 more rows
#
# Edge Data: 23,502 x 3
from to weight
<int> <int> <dbl>
1 1 2 1
2 3 4 2
3 3 5 2
# … with 23,499 more rows
Upvotes: 6
Views: 2712
Reputation: 1201
Extracting the edges and then joining with the nodes to get the name as in the accepted answer is intuitive but requires a lot of steps.
The approach using igraph::get.edgelist
(second answer) loses additional information stored in edges (in the question: weight).
Here's a solution that should work.
your_tbl_graph %>%
activate(edges) %>%
mutate(to_name = .N()$name[to],
from_name = .N()$name[from]) %>%
as_tibble() %>%
select(from = from_name, to = to_name, weight)
Upvotes: 6
Reputation: 1
Load package igraph() and apply the function get.edgelist() to the activated edges set. To get a proper output, also apply data.frame() subsequently. You'll get the named edgelist.
library(igraph)
edge_list <-
tg %>%
activate(edges) %>%
get.edgelist() %>%
data.frame()
Upvotes: 0
Reputation: 2594
You can extract the edge information using data.frame()
on just the edges. You can replace the example tidygraph object I've named tg
with your tidygraph object name and the code below should work for you.
library(igraph)
library(tidygraph)
library(tibble)
# https://tidygraph.data-imaginist.com/reference/tbl_graph.html
rstat_nodes <- data.frame(name = c("Hadley", "David", "Romain", "Julia"))
rstat_edges <- data.frame(from = c(1, 1, 1, 2, 3, 3, 4, 4, 4),
to = c(2, 3, 4, 1, 1, 2, 1, 2, 3),
weight = c(1:9))
tg <- tbl_graph(nodes = rstat_nodes, edges = rstat_edges)
tg
#> # A tbl_graph: 4 nodes and 9 edges
#> #
#> # A directed simple graph with 1 component
#> #
#> # Node Data: 4 x 1 (active)
#> name
#> <fct>
#> 1 Hadley
#> 2 David
#> 3 Romain
#> 4 Julia
#> #
#> # Edge Data: 9 x 3
#> from to weight
#> <int> <int> <int>
#> 1 1 2 1
#> 2 1 3 2
#> 3 1 4 3
#> # ... with 6 more rows
# Get edge information ----
edge_list <-
tg %>%
activate(edges) %>%
data.frame()
edge_list
#> from to weight
#> 1 1 2 1
#> 2 1 3 2
#> 3 1 4 3
#> 4 2 1 4
#> 5 3 1 5
#> 6 3 2 6
#> 7 4 1 7
#> 8 4 2 8
#> 9 4 3 9
But if you also want the names in there as well, here is some code to simply extract the node information as well and join in the data together.
# Separate out edges and node data frames
tg_nodes <-
tg %>%
activate(nodes) %>%
data.frame() %>%
rownames_to_column("rowid") %>%
mutate(rowid = as.integer(rowid))
tg_edges <-
tg %>%
activate(edges) %>%
data.frame()
named_edge_list <-
tg_edges %>%
# Rename from nodes
left_join(tg_nodes, by = c("from" = "rowid")) %>%
select(-from) %>% # Remove unneeded column
rename(from = name) %>% # Rename column with names now
# Rename to nodes
left_join(tg_nodes, by = c("to" = "rowid")) %>%
select(-to) %>% # Remove unneeded column
rename(to = name) %>% # Rename column with names now
# Cleaning up
select(from, to, weight)
named_edge_list
#> from to weight
#> 1 Hadley David 1
#> 2 Hadley Romain 2
#> 3 Hadley Julia 3
#> 4 David Hadley 4
#> 5 Romain Hadley 5
#> 6 Romain David 6
#> 7 Julia Hadley 7
#> 8 Julia David 8
#> 9 Julia Romain 9
Created on 2020-09-21 by the reprex package (v0.3.0)
Upvotes: 8