【问题标题】:Igraph: get ego network density from large networkIgraph:从大型网络中获取自我网络密度
【发布时间】:2021-08-31 19:36:16
【问题描述】:

我有一个青少年友谊提名的网络数据集。我想计算每个自我的本地网络的密度,并理想地使用自我的 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()

【问题讨论】:

    标签: r for-loop dplyr igraph lapply


    【解决方案1】:

    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))
    

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多