【问题标题】:Create grouped edge lists创建分组边列表
【发布时间】:2021-02-16 06:25:55
【问题描述】:

我有一个人员列表,我想检查他们协作网络的特征。但是,我想使用他们网络的所有边缘,而不仅仅是直接连接到它们的边缘。例如,假设我正在查看 Bob 的网络。对于 Project1,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 有更好的方法来做到这一点?

【问题讨论】:

    标签: r igraph


    【解决方案1】:

    这可能是一种选择

    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
    

    【讨论】:

    • 这在我提供的样本数据上完美运行,但是当我在我的真实数据上尝试时,我收到以下错误:“距离错误(g,nm):在 iterators.c: 759:无法创建迭代器,无效的顶点 id,无效的顶点 id”知道这可能是什么吗?
    • 想通了。在我的实际数据中,targets$name 列是数字。将数字传递给 distances() 函数会导致它将数字视为索引,从而导致无效的顶点 id。相反,我通过 "as.character(targets$name)" 强制它考虑顶点名称,而不是将其视为索引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    相关资源
    最近更新 更多