按组获取子图并计算 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)
我有一个约 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)