igraph: суммировать характеристики соседей каждого узла

С помощью объекта igraph я хотел бы зафиксировать некоторые характеристики соседей каждого узла, например среднюю степень его соседей.

Я придумал этот код, который неэлегантен и довольно медленный. Как мне переосмыслить это для больших и сложных сетей?

library(igraph)

# Toy example
set.seed(123)
g <- erdos.renyi.game(10,0.2)

# Loop to calculate average degree of each node's neighbourhood
s <- character(0)
for(i in 1:gorder(g)){
  n <- ego_size(g, nodes = i, order = 1, mindist = 1)
  node_of_interest <- unique(unlist(ego(g, nodes = i, order = 1, mindist = 1)))
  m <- mean(degree(g, v = node_of_interest, loops = TRUE, normalized = FALSE)-1)
  
  s <- rbind(s,data.frame(node = i, neighbours = n, mean = m))

}


person MCS    schedule 07.12.2020    source источник


Ответы (1)


Расширение структуры данных с помощью rbind в цикле может быть довольно медленным в R, потому что на каждом шаге ему нужно выделить место для нового объекта, а затем скопировать его (см. раздел 24.6 здесь). Кроме того, вы можете много раз вычислять степень узла, если он является соседом нескольких узлов.

Возможно, лучшей альтернативой может быть:

# add vertex id (not really necessary)
V(g)$name <- V(g) 

# add degree to the graph
V(g)$degree <- degree(g, loops = TRUE, normalized = FALSE)

# get a list of neighbours, for each node
g_ngh <- neighborhood(g, mindist = 1) 

# write a function that gets the means                       
get.mean <- function(x){
  mean(V(g)$degree[x]-1)
}

# apply the function, add result to the graph
V(g)$av_degr_nei <- sapply(g_ngh, get.mean)


# get data into dataframe, if necessary
d_vert_attr <- as_data_frame(g, what = "vertices")

d_vert_attr
   name degree av_degr_nei
1     1      0         NaN
2     2      1   2.0000000
3     3      2   1.0000000
4     4      1   1.0000000
5     5      2   1.0000000
6     6      1   1.0000000
7     7      3   0.6666667
8     8      1   0.0000000
9     9      1   0.0000000
10   10      0         NaN
person desval    schedule 09.12.2020