【问题标题】:Creating iGraph object by matching ID numbers通过匹配 ID 号创建 iGraph 对象
【发布时间】:2021-11-07 04:58:08
【问题描述】:

我正在寻求解决与为我的硕士论文创建 igraph 对象相关的问题。我需要对通过项目 ID 匹配参与者的数据库进行网络分析 - 总共约有 1500 行,由大约 600 个左右不同的参与者和大约 300 个左右的项目组成。多个参与者参与多个不同的项目。代码示例如下

   Participant_ID Project_Number
1               1         101314
2               2         101314
3               3         101314
4               1         101314
5               5         101346
6               6         101346
7               7         101346
8               8         101531
9               9         101531
10              3         101531
11             11         101533
12              8         101533
13              3         101533
14             14         101533
15              9         101612

如何以创建网络的方式匹配这些?我如何将这些编码到边缘列表中 - 无论是通过矩阵还是其他方式,因为每个项目都有很多观察结果和不同数量的参与者。我发现很难在网上找到很多展示如何通过 ID 号创建边缘列表的内容,我需要克服我想象中相当普通的几行代码。

【问题讨论】:

  • **** 我注意到其中有一个重复项 - 我已将参与者 ID 匿名化,因为它们实际上是人名,但实际数据集中没有重复项,只是为了清理

标签: r matrix networking igraph edges


【解决方案1】:

像这样? Project_Number 必须转换为一个因子,以防止创建具有 100k+ 个节点的图:

library(tidyverse)
library(tidygraph)
#> 
#> Attaching package: 'tidygraph'
#> The following object is masked from 'package:stats':
#> 
#>     filter

graph <-
  tribble(
    ~Participant_ID, ~Project_Number,
    1, 101314,
    2, 101314,
    3, 101314,
    1, 101314
  ) %>%
  mutate(Project_Number = Project_Number %>% factor()) %>%
  tbl_graph(edges = .)
graph
#> # A tbl_graph: 4 nodes and 4 edges
#> #
#> # A directed acyclic multigraph with 1 component
#> #
#> # Node Data: 4 × 1 (active)
#>   name  
#>   <chr> 
#> 1 1     
#> 2 101314
#> 3 2     
#> 4 3     
#> #
#> # Edge Data: 4 × 2
#>    from    to
#>   <int> <int>
#> 1     1     2
#> 2     3     2
#> 3     4     2
#> # … with 1 more row

graph %>% as.igraph() %>% plot()

reprex package 创建于 2021-09-10 (v2.0.1)

【讨论】:

    【解决方案2】:

    也许二分图会有所帮助

    graph_from_data_frame(df) %>%
      set_vertex_attr(name = "type", value = names(V(.)) %in% df$Participant_ID) %>%
      plot(layout = layout_as_bipartite)
    


    如果想要矩阵输出,可以试试

    > table(df)
                  Project_Number
    Participant_ID 101314 101346 101531 101533 101612
                1       2      0      0      0      0
                2       1      0      0      0      0
                3       1      0      1      1      0
                5       0      1      0      0      0
                6       0      1      0      0      0
                7       0      1      0      0      0
                8       0      0      1      1      0
                9       0      0      1      0      1
                11      0      0      0      1      0
                14      0      0      0      1      0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多