[This article was first published on
novyden, and kindly contributed to
R-bloggers]. (You can report issue about the content on this page
here)
Want to share your content on R-bloggers?
click hereif you have a blog, or
hereif you don't.
While working on new graph functions for my package toaster I had to pick from the R packages that represent graphs. The choice was between network and graph objects from the network and igraph correspondingly – the two most prominent packages for creating and manipulating graphs and networks in R. Interchangeability of network and graph objectsOne can always use them interchangeably with little effort using package intergraph. Its sole purpose is providing “coercion routines for network data objects”. Simply use its asNetwork and asIgraph functions to convert from one network representation to another:library(igraph) library(network) library(intergraph) # igraph pkg.igraph = graph_from_edgelist(edges.mat, directed = TRUE) pkg.network.from.igraph = asNetwork(pkg.igraph) all.equal(length(get.edgelist(pkg.igraph)), length(as.matrix(pkg.network.from.igraph, "edgelist"))) # network pkg.network = network(edges.mat) pkg.igraph.from.network = asIgraph(pkg.network) all.equal(length(as.matrix(pkg.network, "edgelist")), length(get.edgelist(pkg.igraph.from.network)))
For more on using intergraph functions see tutorial.
Package dependencies with miniCRANTo assess relative importance of packages network and igraph we will use package miniCRAN. Its access to CRAN packages’ metadata including dependencies via “Depends”, “Imports”, “Suggests” provides necessary information about package relationships. Built-in makeDepGraph function recursively retrieves these dependencies and builds corresponding graph:
library(miniCRAN) cranInfo = pkgAvail() plot(makeDepGraph(c("network"), availPkgs = cranInfo)) plot(makeDepGraph(c("igraph"), availPkgs = cranInfo))
cranInfoDF = as.data.frame(cranInfo, stringsAsFactors = FALSE) edges = ddply(cranInfoDF, .(Package), function(x) { # split all implied (depends, imports, and suggests) packages and then concat into single array l = unlist(sapply(x[c('Depends','Imports','Suggests')], strsplit, split="(,|, |,\n|\n,| ,| , )")) # remove version info and empty fields that became NA l = gsub("^([^ \n(]+).*$", "\\1", l[!is.na(l)]) # take care of empty arrays if (is.null(l) || length(l) == 0) NULL else data.frame(Package = x['Package'], Implies = l, stringsAsFactors = FALSE) } ) edges.mat = as.matrix(edges, ncol=2, dimnames=c('from','to')) pkg.graph = graph_from_edgelist(edges.mat, directed = TRUE)
The resulting network pkg.graph contains all CRAN packages and their relationships. Let’s extract and compare the neighborhoods for the two packages we are interested in:
# build subgraphs for each package subgraphs = make_ego_graph(pkg.graph, order=1, nodes=c("igraph","network"), mode = "in") g.igraph = subgraphs[[1]] g.network = subgraphs[[2]] # plotting subgraphs V(g.igraph)$color = ifelse(V(g.igraph)$name == "igraph", "orange", "lightblue") plot(g.igraph, main="Packages pointing to igraph") V(g.network)$color = ifelse(V(g.network)$name == "network", "orange", "lightblue") plot(g.network, main="Packages pointing to network")
Package igraph can produce various centrality measures on the nodes of a graph. In particular, pagerank centrality and eigenvector centrality scores are principal indicators of the importance of a node in given graph. We finish this exercise with validation using centrality scores for our initial conclusion that igraph package is more accepted and utilized across CRAN ecosystem than network package:
# PageRank pkg.pagerank = page.rank(pkg.graph, directed = TRUE) # Eigenvector Centrality pkg.ev = evcent(pkg.graph, directed = TRUE) toplot = rbind(data.frame(centrality="pagerank", type = c('igraph','network'), value = pkg.pagerank$vector[c('igraph','network')]), data.frame(centrality="eigenvector", type = c('igraph','network'), value = pkg.ev$vector[c('igraph','network')])) library(ggplot2) library(ggthemes) ggplot(toplot) + geom_bar(aes(type, value, fill=type), stat="identity") + facet_wrap(~centrality, ncol = 2)
Both packages igraph and network are widely used across CRAN ecosystem. Due to its versatility and rich set of functions igraph leads in acceptance and importance. But as far as graph objects concern it is still a matter of the requirements to prefer one’s or another’s objects in R.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4