创建分组边列表

Create grouped edge lists

我有一个人员列表,我想检查他们协作网络的特征。但是,我想使用他们网络的所有边缘,而不仅仅是直接连接到它们的边缘。例如,假设我正在查看 Bob 的网络。对于项目 1,Bob、Bill 和 Jane 一起工作。

如果我只关心与 Bob 相连的边,那么我的边列表将是:Bob--Bill,Bob--Jane。网络将有 0 个三角形。但是,如果我查看 Bob 网络的所有边,边列表将如下所示:Bob--Bill、Bob--Jane、Bill--Jane。网络将有 1 个三角形。

我能想到的唯一方法是创建一个“分组”边缘列表。我只是不确定如何解决它。

我的边缘数据是这样的:

collab <- data.frame(vertex1 = c("Bob","Bill","Bob","Jane","Bill","Jane","Bob","Jane","Bob","Bill","Bob"
                                  ,"Jane","Bill","Jane","Bob","Jane","Jane","Jill","Jane","Susan","Susan"),
                      edgeID = c(1,1,1,1,1,1,2,2,1,1,1,1,1,1,2,2,3,3,3,3,3),
                      vertex2 = c("Bill","Bob","Jane","Bob","Jane","Jill","Jane","Bob","Bill","Bob"
                                  ,"Jane","Bob","Jane","Bill","Jane","Bob","Jill","Jane","Susan","Jane","Jill"))
   vertex1 edgeID vertex2
1      Bob      1    Bill
2     Bill      1     Bob
3      Bob      1    Jane
4     Jane      1     Bob
5     Bill      1    Jane
6     Jane      1    Jill
7      Bob      2    Jane
8     Jane      2     Bob
9     Jane      3    Jill
10    Jill      3    Jane
11    Jane      3   Susan
12   Susan      3    Jane
13   Susan      3    Jill

我有另一个包含目标人姓名的向量:

targets <- data.frame(name=c("Bob","Jane"))

我想做的是将相关边分组到适当的目标下,这样的结果类似于:

   group vertex1 edgeID vertex2
1    Bob     Bob      1    Bill
2    Bob    Bill      1     Bob
3    Bob     Bob      1    Jane
4    Bob    Jane      1     Bob
5    Bob    Bill      1    Jane
6    Bob    Jane      1    Jill
7    Bob     Bob      2    Jane
8    Bob    Jane      2     Bob
9   Jane     Bob      1    Bill
10  Jane    Bill      1     Bob
11  Jane     Bob      1    Jane
12  Jane    Jane      1     Bob
13  Jane    Bill      1    Jane
14  Jane    Jane      1    Bill
15  Jane     Bob      2    Jane
16  Jane    Jane      2     Bob
17  Jane    Jane      3    Jill
18  Jane    Jill      3    Jane
19  Jane    Jane      3   Susan
20  Jane   Susan      3    Jane
21  Jane   Susan      3    Jill

我想,如果我能做到这一点,我可以制作一个循环遍历每个目标的 for 循环,使用 iGraph 创建一个图,并为 Bob 和 Jane 计算网络指标,不会有太大问题。我这样做的方式是否正确,或者 iGraph 是否有更好的方式来做到这一点?

这里可能有一个选项

g <- graph_from_data_frame(collab[c(1, 3, 2)], directed = FALSE)
do.call(
  rbind,
  c(
    make.row.names = FALSE,
    lapply(
      targets$name,
      function(nm) {
        z <- c(nm, V(g)$name[distances(g, nm) == 1])
        cbind(group = nm, unique(subset(collab, vertex1 %in% z & vertex2 %in% z)))
      }
    )
  )
)

这给出了

   group vertex1 edgeID vertex2
1    Bob     Bob      1    Bill
2    Bob    Bill      1     Bob
3    Bob     Bob      1    Jane
4    Bob    Jane      1     Bob
5    Bob    Bill      1    Jane
6    Bob     Bob      2    Jane
7    Bob    Jane      2     Bob
8    Bob    Jane      1    Bill
9   Jane     Bob      1    Bill
10  Jane    Bill      1     Bob
11  Jane     Bob      1    Jane
12  Jane    Jane      1     Bob
13  Jane    Bill      1    Jane
14  Jane    Jane      1    Jill
15  Jane     Bob      2    Jane
16  Jane    Jane      2     Bob
17  Jane    Jane      1    Bill
18  Jane    Jane      3    Jill
19  Jane    Jill      3    Jane
20  Jane    Jane      3   Susan
21  Jane   Susan      3    Jane
22  Jane   Susan      3    Jill