Igraph:从大型网络中获取自我网络密度

Igraph: get ego network density from large network

我有一个青少年友谊提名的网络数据集。我想计算每个自我本地网络的密度,理想情况下用自我的 ID 号和自我网络密度得分创建一个新的数据框。

示例边缘列表:

df<-read.table(text="student_id alter
 1     3
 2     5
 2     2
 2     3
 3     2
 3     4
 3     5
 4     1
 4     6
 4     3
 5     1
 5     6
 5     2
 6     5
 6     2
 6     1
 7     8
 8     9
 9     8
 9     7
10     7
10     9
11    19
11    15
11    12
12    20
12    19
12    11
13    15
13    19
13    11
14    16
14    12
14    18
15    17
15    20
15    17
16    14
16    19
16    20
16    13
17    20
17    18
17    13
17    14
18    13
18    19
18    17
19    17
19    16
19    11
20    13
20    17
20    11
20    1", header = TRUE) 

期望的输出:

student_id egonet_density
1          0.5000000
2          0.7500000
3          0.5500000
4          0.5000000
5          0.6000000
6          0.5000000
7          0.5000000
8          0.6666667
9          0.5000000
10         0.5000000
11         0.4333333
12         0.4500000
13         0.4107143
14         0.4000000
15         0.5500000
16         0.4500000
17         0.4047619
18         0.4500000
19         0.3809524
20         0.3750000

这是我目前试过的代码。问题是密度 df 只有密度值,它不包括自我 ID 号。自我 ID 不是连续的,所以我不能只使用 rowname_to_column 来让它工作。任何帮助都会很棒!

g <- graph_from_data_frame(df, directed = TRUE)

egonet_list <- make_ego_graph(g)

densities <- lapply(egonet_list, graph.density)
densities <- unlist(densities) %>% as.data.frame()

V() 创建一个使用节点名称命名的整数序列向量。下面的代码将相应的自我节点及其密度度量放在一起。为了演示,我将数据集中的学生 ID 从 20 更改为 21。

g <- graph_from_data_frame(df, directed = TRUE)
egonet_list <- make_ego_graph(g)

dat <- data.frame(
  student_id = names(V(g)),
  egonet_density = lapply(egonet_list, graph.density) %>% unlist()
)

dat

#    student_id egonet_density
# 1           1      0.3666667
# 2           2      0.7500000
# 3           3      0.5500000
# 4           4      0.5000000
# 5           5      0.6000000
# 6           6      0.5000000
# 7           7      0.5000000
# 8           8      0.6666667
# 9           9      0.5000000
# 10         10      0.5000000
# 11         11      0.4333333
# 12         12      0.4000000
# 13         13      0.4107143
# 14         14      0.3500000
# 15         15      0.5500000
# 16         16      0.4000000
# 17         17      0.3809524
# 18         18      0.4500000
# 19         19      0.3809524
# 20         21      0.3035714

这是修改后的数据集:

structure(list(student_id = c(1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 8L, 9L, 9L, 10L, 10L, 11L, 
11L, 11L, 12L, 12L, 12L, 13L, 13L, 13L, 14L, 14L, 14L, 15L, 15L, 
15L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 19L, 
19L, 19L, 21L, 21L, 21L, 21L), alter = c(3L, 5L, 2L, 3L, 2L, 
4L, 5L, 1L, 6L, 3L, 1L, 6L, 2L, 5L, 2L, 1L, 8L, 9L, 8L, 7L, 7L, 
9L, 19L, 15L, 12L, 21L, 19L, 11L, 15L, 19L, 11L, 16L, 12L, 18L, 
17L, 21L, 17L, 14L, 19L, 21L, 13L, 21L, 18L, 13L, 14L, 13L, 19L, 
17L, 17L, 16L, 11L, 13L, 17L, 11L, 1L)), class = "data.frame", row.names = c(NA, 
-55L))