Igraph:从大型网络中获取自我网络密度 [英] Igraph: get ego network density from large network

查看:19
本文介绍了Igraph:从大型网络中获取自我网络密度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

示例边列表:

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数。EGO 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()创建使用节点名称命名的整数序列向量。下面的代码将相应的EGO节点及其密度度量组合在一起。为了进行演示,我将数据集中的学生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))

这篇关于Igraph:从大型网络中获取自我网络密度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆