0
votes

I have a weighted, undirected network with weights 1 and 2. I need to choose the neighbors of all the vertices that are up to 5 step away. However the 5 steps should include 2 edges with weight=2. For example, if all the 5 edges have weight 1, these neighbors should be excluded. Question: How do I choose neighbors that are connected with specific edge weights?

Code:

matrix= matrix(as.integer(runif(100,0,3)), 10, 10)
matrix
ntwrk=graph.adjacency(matrix,weighted=TRUE, mode="undirected")
neighborhood(ntwrk,5)

Now, I need to figure out which one of those include edges with weight=2. Then, I need to keep only those neighbors, and measure the neighborhood size with neighborhood.size

1

1 Answers

1
votes

The result of neighborhood is a list of of list of edges. You can use lapply and filter each list using the attribute weight.

res.tokeep <- lapply(res, function(x) which(E(ntwrk)[x]$weight==2))

Here a complete example , where I plot the graph before and after the weight filter.

library(igraph)
set.seed(1)
mat = matrix(as.integer(runif(10*10,0,3)), 10, 10)

ntwrk=graph.adjacency(mat,weighted=TRUE, mode="undirected")
res <- neighborhood(ntwrk,5)
op <- par(mfrow=c(1,2))
E(ntwrk)$label <- E(ntwrk)$weight
plot(ntwrk)
res.tokeep <- lapply(res, function(x) which(E(ntwrk)[x]$weight==2))
res.todelete <- lapply(res, function(x) which(E(ntwrk)[x]$weight!=2))

ntwrk <- delete.vertices(ntwrk, unique(unlist(res.todelete)))
plot(ntwrk)

par(mfrow=op)

enter image description here