
pause <- function() {}

### R objects, (real) numbers
a <- 3
a
b <- 4
b
a + b

pause()

### Case sensitive
A <- 16
a
A

pause()

### Vector objects
a <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
a
b <- 1:100
b
a[1]
b[1:5]
a[1] <- 10
a
a[1:4] <- 2
a

pause()

### Vector arithmetic
a * 2 + 1

pause()

### Functions
ls()
length(a)
mean(a)
sd(a)
sd
c

pause()

### Getting help
# ?sd
# ??"standard deviation"
# RSiteSearch("network betweenness")

pause()

### Classes
class(2)
class(1:10)
class(sd)

pause()

### Character vectors
char.vec <- c("this", "is", "a", "vector", "of", "characters")
char_vec <- char.vec
char.vec[1]

pause()

### Index vectors
age <- c(45, 36, 65, 21, 52, 19)
age[1]
age[1:5]
age[c(2, 5, 6)]

b[seq(1, 100, by = 2)]

pause()

### Named vectors
names(age) <- c("Alice", "Bob", "Cecil", "David", "Eve", "Fiona")
age
age["Bob"]
age[c("Eve", "David", "David")]

pause()

### Indexing with logical vectors
age[c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)]
names(age)[age > 40]
age > 40

pause()

### Matrices
M <- matrix(1:20, 10, 2)
M
M2 <- matrix(1:20, 10, 2, byrow = TRUE) ## Named argument!
M2
M[1, 1]
M[1, ]
M[, 1]
M[1:5, 2]

pause()

### Generic functions
sd(a)
sd(M)
class(a)
class(M)

pause()

### Lists
l <- list(1:10, "Hello!", diag(5))
l
l[[1]]
l[2:3]
l
l2 <- list(A = 1:10, H = "Hello!", M = diag(5))
l2
l2$A
l2$M

pause()

### Factors
countries <- c(
  "SUI", "USA", "GBR", "GER", "SUI",
  "SUI", "GBR", "GER", "FRA", "GER"
)
countries
fcountries <- factor(countries)
fcountries
levels(fcountries)

pause()

### Data frames
survey <- data.frame(
  row.names = c("Alice", "Bob", "Cecil", "David", "Eve"),
  Sex = c("F", "M", "F", "F", "F"),
  Age = c(45, 36, 65, 21, 52),
  Country = c("SUI", "USA", "SUI", "GBR", "USA"),
  Married = c(TRUE, FALSE, FALSE, TRUE, TRUE),
  Salary = c(70, 65, 200, 45, 100)
)
survey
survey$Sex
plot(survey$Age, survey$Salary)
AS.model <- lm(Salary ~ Age, data = survey)
AS.model
summary(AS.model)
abline(AS.model)

tapply(survey$Salary, survey$Country, mean)

pause()

### Packages
# install.packages("igraph")
# library(help="igraph")
library(igraph)
sessionInfo()

pause()

### Graphs
## Create a small graph, A->B, A->C, B->C, C->E, D
## A=1, B=2, C=3, D=4, E=5
g <- make_graph(c(1, 2, 1, 3, 2, 3, 3, 5), n = 5)

pause()

### Print a graph to the screen
g

pause()

### Create an undirected graph as well
## A--B, A--C, B--C, C--E, D
g2 <- make_graph(c(1, 2, 1, 3, 2, 3, 3, 5), n = 5, dir = FALSE)
g2

pause()

### Is this object an igraph graph?
is_igraph(g)
is_igraph(1:10)

pause()

### Summary, number of vertices, edges
summary(g)
vcount(g)
ecount(g)

pause()

### Is the graph directed?
is_directed(g)
is_directed(g2)

pause()

### Convert from directed to undirected
as.undirected(g)

pause()

### And back
as.directed(as.undirected(g))

pause()

### Multiple edges
g <- make_graph(c(1, 2, 1, 2, 1, 3, 2, 3, 4, 5), n = 5)
g

is_simple(g)
which_multiple(g)

pause()

### Remove multiple edges
g <- simplify(g)
is_simple(g)

pause()

### Loop edges
g <- make_graph(c(1, 1, 1, 2, 1, 3, 2, 3, 4, 5), n = 5)
g

is_simple(g)
which_loop(g)

pause()

### Remove loop edges
g <- simplify(g)
is_simple(g)

pause()

### Naming vertices
g <- make_ring(10)
V(g)$name <- letters[1:10]
V(g)$name
g
print(g, v = T)

pause()

### Create undirected example graph
g2 <- graph_from_literal(
  Alice - Bob:Cecil:Daniel,
  Cecil:Daniel - Eugene:Gordon
)
print(g2, v = T)

pause()

### Remove Alice
g3 <- delete_vertices(g2, match("Alice", V(g2)$name))

pause()

### Add three new vertices
g4 <- add_vertices(g3, 3)
print(g4, v = T)
igraph_options(
  print.vertex.attributes = TRUE,
  plot.layout = layout_with_fr
)
g4
plot(g4)

pause()

### Add three new vertices, with names this time
g4 <- add_vertices(g3, 3, attr = list(name = c("Helen", "Ike", "Jane")))
g4

pause()

### Add some edges as well
g4 <- add_edges(g4, match(c("Helen", "Jane", "Ike", "Jane"), V(g4)$name))
g4

pause()

### Edge sequences, first create a directed example graph
g2 <- graph_from_literal(
  Alice -+ Bob:Cecil:Daniel,
  Cecil:Daniel +-+ Eugene:Gordon
)
print(g2, v = T)
plot(g2, layout = layout_with_kk, vertex.label = V(g2)$name)

pause()

### Sequence of all edges
E(g2)

pause()

### Edge from a vertex to another
E(g2, P = c(1, 2))

pause()

### Delete this edge
g3 <- delete_edges(g2, E(g2, P = c(1, 2)))
g3

pause()

### Get the id of the edge
as.vector(E(g2, P = c(1, 2)))

pause()

### All adjacent edges of a vertex
E(g2)[adj(3)]

pause()

### Or multiple vertices
E(g2)[adj(c(3, 1))]

pause()

### Outgoing edges
E(g2)[from(3)]

pause()

### Incoming edges
E(g2)[to(3)]

pause()

### Edges along a path
E(g2, path = c(1, 4, 5))
