按组获取子图并计算 R 中的网络模块性

Get subgraphs by group and calculate network modularity in R

我有一个约 80 所学校的网络数据集(节点是每所学校的学生)。我需要计算每所学校的模块化。理想情况下,创建一个只有学校 ID 和学校模块化分数的新数据框。

数据受限,所以我不能post,但这是一个玩具示例:

有数据

student_id    school_id    friendid_1    friendid_2    friendid_3    friendid_4
1             101          3             NA            NA            NA
2             101          5             2             3             NA
3             101          2             4             5             NA
4             101          1             6             NA            3
5             101          1             NA            6             2
6             101          5             NA            2             1
7             201          8             NA            NA            NA
8             201          NA            9             NA            NA
9             201          8             7             NA            NA
10            201          7             9             NA            NA
11            301          19            15            NA            12
12            301          20            NA            19            11
13            301          15            19            11            NA
14            301          16            NA            12            18
15            301          17            20            17            NA
16            301          14            19            20            13
17            301          20            18            13            14
18            301          13            NA            19            17
19            301          17            NA            16            11
20            301          13            17            11            14

想要数据(只是学校 ID 和模块化分数

school_id    modularity
101
201
301

以下是我试过的方法。我首先创建了一个只有学校 ID 的数据框。然后尝试了一个 for 循环,我在其中抓取了学校的所有受访者并绘制了他们的图表来计算模块化,然后将其放入学校 DF 中。这没有用:

schools <- as.data.frame(unique(df$school_id))


for (school in 1:length(unique(df$school_id))){

  g <- graph_from_data_frame(school, directed = FALSE)

  sg <- igraph::simplify(g, remove.loops = TRUE)

  cl <- cluster_fast_greedy(sg)

  schools <- modularity(cl)
}

想通了!

df$school_id <- as.factor(df$school_id)

school_list <- list()

for (i in levels(df$school_id)){
     schl <- subset(df, school == i)

     schl_g <- graph_from_data_frame(schl, directed = FALSE) %>%
               igraph::simplify(., remove.loops = TRUE)

     schl_clust <- cluster_fast_greedy(schl_g)

     schl_mod <- modularity(schl_clust)

     id_mod <- select(df, school) %>%
               subset(., school == i) %>%
               unique() 

     id_mod$schl_mod <- schl_mod

     school_list <- c(list(id_mod), school_list)
}


schools <- bind_rows(school_list)