Igraph:从大型网络中获取自我网络密度 [英] Igraph: get ego network density from large network
本文介绍了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屋!
查看全文