friends %>% head()
## name1 name2
## 1 Jessie Sidney
## 2 Jessie Britt
## 3 Sidney Britt
## 4 Sidney Donnie
## 5 Karl Berry
## 6 Sidney Rene
create an igraph ‘object’ from data stored in an edgelist using the graph.edgelist() function.
# Load igraph
# Inspect the first few rows of the dataframe 'friends'
class(friends)
## [1] "data.frame"
# Convert friends dataframe to a matrix
friends.mat <- as.matrix(friends)
# Convert friends matrix to an igraph object
g <- graph.edgelist(friends.mat, directed = FALSE)
# Make a very basic plot of the network
plot(g)
# Subset vertices and edges
V(g)
## + 16/16 vertices, named, from 4739fab:
## [1] Jessie Sidney Britt Donnie Karl Berry Rene Shayne Elisha
## [10] Whitney Odell Lacy Eugene Jude Rickie Tommy
E(g)
## + 27/27 edges from 4739fab (vertex names):
## [1] Jessie --Sidney Jessie --Britt Sidney --Britt Sidney --Donnie
## [5] Karl --Berry Sidney --Rene Britt --Rene Sidney --Shayne
## [9] Sidney --Elisha Sidney --Whitney Jessie --Whitney Donnie --Odell
## [13] Sidney --Odell Rene --Whitney Donnie --Shayne Jessie --Lacy
## [17] Rene --Lacy Elisha --Eugene Eugene --Jude Berry --Odell
## [21] Odell --Rickie Karl --Odell Britt --Lacy Elisha --Jude
## [25] Whitney--Lacy Britt --Whitney Karl --Tommy
# Count number of edges
gsize(g)
## [1] 27
# Count number of vertices
gorder(g)
## [1] 16
using set_vertex_attr() function
# Inspect the objects 'genders' and 'ages'
genders <- c("M", "F", "F", "M", "M", "M", "F", "M", "M", "F", "M", "F", "M", "F", "M", "M")
ages <- c(18, 19, 21, 20, 22, 18, 23, 21, 22, 20, 20, 22, 21, 18, 19, 20)
# Create new vertex attribute called 'gender'
g <- set_vertex_attr(g, "gender", value = genders)
g
## IGRAPH 4739fab UN-- 16 27 --
## + attr: name (v/c), gender (v/c)
## + edges from 4739fab (vertex names):
## [1] Jessie --Sidney Jessie --Britt Sidney --Britt Sidney --Donnie
## [5] Karl --Berry Sidney --Rene Britt --Rene Sidney --Shayne
## [9] Sidney --Elisha Sidney --Whitney Jessie --Whitney Donnie --Odell
## [13] Sidney --Odell Rene --Whitney Donnie --Shayne Jessie --Lacy
## [17] Rene --Lacy Elisha --Eugene Eugene --Jude Berry --Odell
## [21] Odell --Rickie Karl --Odell Britt --Lacy Elisha --Jude
## [25] Whitney--Lacy Britt --Whitney Karl --Tommy
# Create new vertex attribute called 'age'
g <- set_vertex_attr(g, "age", value = ages)
# View all vertex attributes in a list
vertex_attr(g)
## $name
## [1] "Jessie" "Sidney" "Britt" "Donnie" "Karl" "Berry" "Rene"
## [8] "Shayne" "Elisha" "Whitney" "Odell" "Lacy" "Eugene" "Jude"
## [15] "Rickie" "Tommy"
##
## $gender
## [1] "M" "F" "F" "M" "M" "M" "F" "M" "M" "F" "M" "F" "M" "F" "M" "M"
##
## $age
## [1] 18 19 21 20 22 18 23 21 22 20 20 22 21 18 19 20
# View attributes of first five vertices in a dataframe
V(g)[[1:5]]
## + 5/16 vertices, named, from 4739fab:
## name gender age
## 1 Jessie M 18
## 2 Sidney F 19
## 3 Britt F 21
## 4 Donnie M 20
## 5 Karl M 22
use function set_edge_attr()
hours <- c(1, 2, 2, 1, 2, 5, 5, 1, 1, 3, 2, 1, 1, 5, 1, 2, 4, 1, 3, 1, 1, 1, 4, 1, 3, 3, 4)
# View hours
hours
## [1] 1 2 2 1 2 5 5 1 1 3 2 1 1 5 1 2 4 1 3 1 1 1 4 1 3 3 4
# Create new edge attribute called 'hours'
g <- set_edge_attr(g, 'hours', value = hours)
# View edge attributes of graph object
edge_attr(g)
## $hours
## [1] 1 2 2 1 2 5 5 1 1 3 2 1 1 5 1 2 4 1 3 1 1 1 4 1 3 3 4
g
## IGRAPH 4739fab UN-- 16 27 --
## + attr: name (v/c), gender (v/c), age (v/n), hours (e/n)
## + edges from 4739fab (vertex names):
## [1] Jessie --Sidney Jessie --Britt Sidney --Britt Sidney --Donnie
## [5] Karl --Berry Sidney --Rene Britt --Rene Sidney --Shayne
## [9] Sidney --Elisha Sidney --Whitney Jessie --Whitney Donnie --Odell
## [13] Sidney --Odell Rene --Whitney Donnie --Shayne Jessie --Lacy
## [17] Rene --Lacy Elisha --Eugene Eugene --Jude Berry --Odell
## [21] Odell --Rickie Karl --Odell Britt --Lacy Elisha --Jude
## [25] Whitney--Lacy Britt --Whitney Karl --Tommy
# Find all edges that include "Britt"
E(g)[[inc('Britt')]]
## + 5/27 edges from 4739fab (vertex names):
## tail head tid hid hours
## 2 Jessie Britt 1 3 2
## 3 Sidney Britt 2 3 2
## 7 Britt Rene 3 7 5
## 23 Britt Lacy 3 12 4
## 26 Britt Whitney 3 10 3
# Find all pairs that spend 4 or more hours together per week
E(g)[[hours>=4]]
## + 6/27 edges from 4739fab (vertex names):
## tail head tid hid hours
## 6 Sidney Rene 2 7 5
## 7 Britt Rene 3 7 5
## 14 Rene Whitney 7 10 5
## 17 Rene Lacy 7 12 4
## 23 Britt Lacy 3 12 4
## 27 Karl Tommy 5 16 4
friends1_edges %>% head(1)
## name1 name2 hours
## 1 Joe Ronald 1
friends1_nodes %>% head(1)
## name gender
## 1 Joe M
# Create an igraph object with attributes directly from dataframes
g1 <- graph_from_data_frame(d = friends1_edges, vertices = friends1_nodes, directed = FALSE)
# Subset edges greater than or equal to 5 hours
E(g1)[[hours >=5]]
## + 4/25 edges from fb8bf4f (vertex names):
## tail head tid hid hours
## 5 Kelley Valentine 3 6 5
## 8 Ronald Jasmine 4 8 5
## 12 Valentine Perry 6 15 5
## 15 Jasmine Juan 8 9 6
# Set vertex color by gender
V(g1)$color <- ifelse(V(g1)$gender == 'F', "orange", "dodgerblue")
# Plot the graph
plot(g1, vertex.label.color = "black")
Datacamp: Network Analysis in R by JAMES CURLEY