首页 > 解决方案 > 按组获取子图并计算 R 中的网络模块化

问题描述

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

数据受到限制,所以我不能发布它,但这是一个玩具示例:

有数据

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)
}

标签: rfor-loopapplyigraphnetwork-analysis

解决方案


弄清楚了!

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)

推荐阅读