Encode a list of ‘igraph’ objects
Generate a list of igraph objects:
set.seed(666)
igraph_list <- replicate(5, igraph::sample_gnp(10, 0.1, directed=FALSE),
simplify = FALSE)
Encode as ‘graph6’ symbols:
as_graph6(igraph_list)
## [1] "ICG_@?W??" "I????@B?G" "I?@O????W" "I@@A?E???" "I?_?_@_??"
Encode as ‘sparse6’ symbols:
as_sparse6(igraph_list)
## [1] ":IeASjaeR" ":IoCp{^" ":IiC]Rg" ":IeIgWu`" ":IgAo{@D"
Decode a vector of different types of symbols
Using example data g6
, d6
, and
s6
provided with the package:
# Create a vector with a mixture of 'graph6', 'digraph6' and 'sparse6' symbols
x <- c(g6[1], s6[2], d6[3])
x
## [1] "N??E??G?e?G?????GGO"
## [2] ":NkF?XduSqiDRwYU~"
## [3] "&N?R_?E?C?D??U_A????????O???????????????"
# Parse to igraph objects (package igraph required)
igraph_from_text(x)
## [[1]]
## IGRAPH 9c81373 U--- 15 10 --
## + edges from 9c81373:
## [1] 1-- 7 1--11 2-- 7 2--11 2--12 2--15 5-- 9 7--10 8--15 13--15
##
## [[2]]
## IGRAPH 7a56b18 U--- 15 13 --
## + edges from 7a56b18:
## [1] 2-- 7 2-- 9 4--10 6--10 6--12 7--12 11--12 5--13 6--13 10--13
## [11] 4--15 10--15 14--15
##
## [[3]]
## IGRAPH 2bb3286 D--- 15 15 --
## + edges from 2bb3286:
## [1] 1-> 8 1->11 1->12 1->13 2->13 2->14 3->10 4-> 7 4-> 9 5-> 8 5->10 5->11
## [13] 5->13 6-> 8 9->14
# Parse to network objects (package network required)
network_from_text(x)
## Loading required namespace: network
## [[1]]
## Network attributes:
## vertices = 15
## directed = FALSE
## hyper = FALSE
## loops = FALSE
## multiple = FALSE
## bipartite = FALSE
## total edges= 10
## missing edges= 0
## non-missing edges= 10
##
## Vertex attribute names:
## vertex.names
##
## No edge attributes
##
## [[2]]
## Network attributes:
## vertices = 15
## directed = FALSE
## hyper = FALSE
## loops = FALSE
## multiple = FALSE
## bipartite = FALSE
## total edges= 13
## missing edges= 0
## non-missing edges= 13
##
## Vertex attribute names:
## vertex.names
##
## No edge attributes
##
## [[3]]
## Network attributes:
## vertices = 15
## directed = TRUE
## hyper = FALSE
## loops = FALSE
## multiple = FALSE
## bipartite = FALSE
## total edges= 15
## missing edges= 0
## non-missing edges= 15
##
## Vertex attribute names:
## vertex.names
##
## No edge attributes
Tidy graph databases
The formats shine if we need to store large number of graphs in a
data frame. Let’s generate a list of random graphs as igraph objects and
store them in a data frame column of graph6 symbols:
# Generate list of igraph objects
set.seed(666)
d <- data.frame(
g6 = as_graph6(replicate(
10,
igraph::random.graph.game(sample(3:12, replace=TRUE), p=.5, directed=FALSE),
simplify=FALSE
))
)
d
## g6
## 1 FblF_
## 2 DFc
## 3 HfTaMwk
## 4 KefToktrftZ~
## 5 JPraDzZQ?M?
## 6 Bo
## 7 Ed`w
## 8 Gpuq|{
## 9 EbSG
## 10 ICNa@Gg\\o
Nice and compact. We can go further by doing some computations and
saving the results together with the graph data:
d2 <- within(
d, {
igraphs <- igraph_from_text(g6)
vc <- vapply(igraphs, igraph::vcount, integer(1))
ec <- vapply(igraphs, igraph::ecount, numeric(1))
density <- vapply(igraphs, igraph::edge_density, numeric(1))
})
d2$igraphs <- NULL
str(d2, 1)
## 'data.frame': 10 obs. of 4 variables:
## $ g6 : chr "FblF_" "DFc" "HfTaMwk" "KefToktrftZ~" ...
## $ density: num 0.524 0.5 0.5 0.621 0.436 ...
## $ ec : num 11 5 18 41 24 2 8 19 6 17
## $ vc : int 7 5 9 12 11 3 6 8 6 10
… and even save it to a simple CSV file!
write.csv(d2, row.names = FALSE)
## "g6","density","ec","vc"
## "FblF_",0.523809523809524,11,7
## "DFc",0.5,5,5
## "HfTaMwk",0.5,18,9
## "KefToktrftZ~",0.621212121212121,41,12
## "JPraDzZQ?M?",0.436363636363636,24,11
## "Bo",0.666666666666667,2,3
## "Ed`w",0.533333333333333,8,6
## "Gpuq|{",0.678571428571429,19,8
## "EbSG",0.4,6,6
## "ICNa@Gg\o",0.377777777777778,17,10