`## Loading required package: igraph`

```
##
## Attaching package: 'igraph'
```

```
## The following objects are masked from 'package:stats':
##
## decompose, spectrum
```

```
## The following object is masked from 'package:base':
##
## union
```

Rnetcarto provides fast network modularity and roles computation by simulated annealing (rgraph C library wrapper for R).

It exposes one main command named `netcarto`

that take a graph as an input (formatted as an **adjacency matrix** or **list**, as described in more detail below) and returns a partition of the graph optimizing a given modularity criterion. It also computes the modularity roles of the nodes.

Here is a small example:

```
# Generate a simple random network
matrix(as.integer(runif(100)<.3), ncol=10)
a =lower.tri(a)] = 0
a[rownames(a) = c('a','b','b','c','d','e','f','g','h','i')
colnames(a) = rownames(a)
# Find an optimal partition for modularity using netcarto.
# The output consists in a table containing node properties,
# and the modularity value of the partition.
netcarto(a)
```

```
## [[1]]
## name module connectivity participation role
## 4 c 0 -1.0000000 0.0000000 Ultra peripheral
## 5 d 0 1.0000000 0.6250000 Connector
## 2 b 1 -1.2247449 0.0000000 Ultra peripheral
## 8 g 1 -1.2247449 0.0000000 Ultra peripheral
## 1 a 1 0.8164966 0.3200000 Peripheral
## 6 e 1 0.8164966 0.3200000 Peripheral
## 10 i 1 0.8164966 0.3200000 Peripheral
## 7 f 2 -0.7071068 0.0000000 Ultra peripheral
## 3 b 2 -0.7071068 0.6666667 Connector
## 9 h 2 1.4142136 0.4444444 Peripheral
##
## [[2]]
## [1] 0.1373457
```

The `netcarto`

function can read network in either adjacency matrix or adjacency list format.

square symmetric matrix. In this format, the weight \(w\) of an between If you choose the **matrix format**, your network must consist in a vertices \(i\) and \(j\) is given by the corresponding value in the matrix `web[i,j]`

. Auto-loop (i.e. diagonal terms are authorised). You may name the rows and/or columns, those names will be used in the function output. Example:

```
matrix(0,3,3)
input =1,2] = 1
input[2,3] = 1
input[3,1] = 1
input[2,1] = 1
input[3,2] = 1
input[1,3] = 1
input[rownames(input) = c("A","B","C")
colnames(input) = rownames(input)
print(input)
```

```
## A B C
## A 0 1 1
## B 1 0 1
## C 1 1 0
```

Note that `igraph`

package can be used to manipulate and plot graphs:

```
# import from rnetcarto matrix format to igraph:
igraph::graph.adjacency(input,weighted=TRUE,mode="undirected")
G =# Export to a matrix compatible with netcarto:
igraph::get.adjacency(G,sparse=FALSE) input =
```

```
matrix(0,7,7)
input =1,2] = 10
input[2,3] = 10
input[3,1] = 10
input[4,5] = 10
input[5,6] = 10
input[6,4] = 10
input[rownames(input) = c("A","B","C","D","E","F","G")
colnames(input) = rownames(input)
```

Note that:

- Empty columns and lines are removed (Here
`G`

). - If the matrix is not symmetric, symmetry will be enforced by taking
`web = web+t(web)-diag(web)`

So the previous matrix is equivalent to:

```
## A B C D E F
## A 0 10 10 0 0 0
## B 10 0 10 0 0 0
## C 10 10 0 0 0 0
## D 0 0 0 0 10 10
## E 0 0 0 10 0 10
## F 0 0 0 10 10 0
```

Note that the matrix *may* not be square and symmetric *if and only if* you are considering a bipartite network (using the `bipartite`

flag).

```
matrix(0,6,2)
input =1,1] = 1
input[2,1] = 1
input[3,1] = 1
input[4,2] = 1
input[5,2] = 1
input[6,2] = 1
input[rownames(input) = c("A","B","C","D","E","F")
colnames(input) = c("Team 1", "Team 2")
print(input)
```

```
## Team 1 Team 2
## A 1 0
## B 1 0
## C 1 0
## D 0 1
## E 0 1
## F 0 1
```

If you choose the **list format**, your network must be formatted as a R-list. The first element must be a vector giving the label. The third element is a vector of the edge weights. The weights are optional and are all set to one if the list contains only the first two elements.

```
c("A","B","C","D","E","F","C")
nd1 = c("B","C","A","E","F","D","D")
nd2 = list(nd1,nd2,weights)
web =print(list(nd1,nd2))
```

```
## [[1]]
## [1] "A" "B" "C" "D" "E" "F" "C"
##
## [[2]]
## [1] "B" "C" "A" "E" "F" "D" "D"
```

```
c("A","B","C","D","E","F","C","A")
nd1 = c("B","C","A","E","F","D","D","D")
nd2 = c(10,10,10,10,10,10,10,10,1)
weights = list(nd1,nd2,weights)
web =print(web)
```

```
## [[1]]
## [1] "A" "B" "C" "D" "E" "F" "C" "A"
##
## [[2]]
## [1] "B" "C" "A" "E" "F" "D" "D" "D"
##
## [[3]]
## [1] 10 10 10 10 10 10 10 10 1
```

```
c("A","B","C","D","E","F","C","A")
nd1 = c("Team1","Team2","Team1","Team1","Team2","Team1","Team1","Team2")
nd2 = list(nd1,nd2)
bipartite =print(bipartite)
```

```
## [[1]]
## [1] "A" "B" "C" "D" "E" "F" "C" "A"
##
## [[2]]
## [1] "Team1" "Team2" "Team1" "Team1" "Team2" "Team1" "Team1" "Team2"
```

The `netcarto`

command output a list. Its first element is a dataframe giving the name module, connectivity, and participation coefficient for each node of the input graph. The second element is the modularity of this optimal partition.

`netcarto(igraph::get.adjacency(G,sparse=FALSE)) `

```
## [[1]]
## name module connectivity participation role
## 4 D 0 0 0 Ultra peripheral
## 5 E 0 0 0 Ultra peripheral
## 6 F 0 0 0 Ultra peripheral
## 1 A 1 0 0 Ultra peripheral
## 2 B 1 0 0 Ultra peripheral
## 3 C 1 0 0 Ultra peripheral
##
## [[2]]
## [1] 0.5
```

`netcarto(bipartite, bipartite=TRUE) `

```
## [[1]]
## name module connectivity participation role
## 4 D 0 -0.5773503 0.0000000 Ultra peripheral
## 6 F 0 -0.5773503 0.0000000 Ultra peripheral
## 1 A 0 -0.5773503 0.4444444 Peripheral
## 3 C 0 1.7320508 0.0000000 Ultra peripheral
## 2 B 1 0.0000000 0.5000000 Peripheral
## 5 E 1 0.0000000 0.5000000 Peripheral
##
## [[2]]
## [1] 0.3317308
```