R Graph Objects: igraph vs. network
This article is originally published at https://novyden.blogspot.com/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 objects
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 miniCRAN
|
Unfortunately, these dependency graphs show how network and igraph depend on other CRAN packages while the goal is to evaluate relationships the other way around: how much other CRAN packages depend on the two.
This will require some assembly as we construct a network of packages manually with edges being directed relationships (one of "Depends", "Imports", or "Suggests") as defined in DESCRIPTION for all packages. The following code builds this igraph object (we chose igraph for its functions utilized later):
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")
The igraph neighborhood is much denser populated subgraph than the network neighborhood and hence its importance and acceptance must be higher.
Package Centrality Scores
# 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)
Thanks for visiting r-craft.org
This article is originally published at https://novyden.blogspot.com/
Please visit source website for post related comments.