如何解决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
这是我迄今为止尝试过的代码。问题是 densities df 只有密度值,它不包括 ego 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()
创建一个使用节点名称命名的整数序列向量。下面的代码将相应的自我节点及其密度度量放在一起。为了演示,我将您数据集中的学生 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,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L,13L,14L,15L,16L,17L,18L,19L,21L,21L),alter = c(3L,1L,1L)),class = "data.frame",row.names = c(NA,-55L))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。