首页 > 解决方案 > Igraph:仅获取更改的自我网络密度

问题描述

我有一个自我网络列表,我的目标是只获得改变的密度。所以基本上从密度计算中去除了自我。

使用我上一个问题中的相同样本数据,我可以使用该答案来获取自我网络密度列表,但如何不能将每个自我包括在该计算中?

数据:

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) 

当前代码:

g <- graph_from_data_frame(df, directed = TRUE)
egonet_list <- make_ego_graph(g, order = 1, mode = "out")

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

但我想要的输出,意味着从密度计算中删除自我,只得到改变的密度。

更新

例如,数据示例中的 student_id 为 18:

egonet_list[[18]] %>% delete.vertices(., "18") %>% graph.density()

我正在努力的地方是如何在应用或循环中执行此操作,以便它可以通过每个自我网络运行并执行此操作。

标签: rdplyrapplyigraph

解决方案


我们可以试试下面的代码

dat <- data.frame(
  student_id = names(V(g)),
  egonet_density = mapply(function(gnet, v) graph.density(delete.vertices(gnet, v)), egonet_list, as.list(names(V(g))))
)

这使

> dat
   student_id egonet_density
1           1            NaN
2           2      0.5000000
3           3      0.5000000
4           4      0.3333333
5           5      0.5000000
6           6      0.6666667
7           7            NaN
8           8            NaN
9           9      0.5000000
10         10      0.5000000
11         11      0.1666667
12         12      0.5000000
13         13      0.5000000
14         14      0.0000000
15         15      1.0000000
16         16      0.1666667
17         17      0.2500000
18         18      0.5000000
19         19      0.0000000
20         20      0.1666667

推荐阅读