【问题标题】:Extracting Open Triangles in R Igraph (Network Analysis)在 R Igraph 中提取开三角形(网络分析)
【发布时间】:2016-05-22 13:15:00
【问题描述】:

我有一个边列表,我想在其中提取 开放 三角形,这意味着如果:A 知道 B 并且 B 知道 C,但 C 与 A 的关系未在图中捕获。

有没有办法在 R 中提取它?我知道你可以用普通三角形做到这一点,但我想知道你是否可以提取空三角形。

我在 R 中创建了一个网络图,其边缘列表如下所示:

structure(list(ego = c(323L, 174L, 174L, 174L, 174L, 174L, 174L, 
174L, 174L, 174L, 428L, 428L, 428L, 428L, 428L, 428L, 428L, 428L, 
364L, 364L, 364L, 364L, 364L, 364L, 364L, 364L, 422L, 422L, 422L, 
422L, 422L, 422L, 422L, 422L, 329L, 329L, 329L, 329L, 329L, 329L, 
329L, 329L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 330L, 330L, 
330L, 330L, 330L, 330L, 330L, 330L, 415L, 428L), alter = c(174L, 
323L, 428L, 364L, 422L, 329L, 31L, 330L, 415L, 392L, 174L, 364L, 
422L, 329L, 31L, 330L, 415L, 392L, 174L, 428L, 422L, 329L, 31L, 
330L, 415L, 392L, 174L, 428L, 364L, 329L, 31L, 330L, 415L, 392L, 
174L, 428L, 364L, 422L, 31L, 330L, 415L, 392L, 174L, 428L, 364L, 
422L, 329L, 330L, 415L, 392L, 174L, 428L, 364L, 422L, 329L, 31L, 
415L, 392L, 174L, 323L), advice_tie = c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("ego", "alter", "advice_tie"
), class = "data.frame", row.names = c(NA, -60L))

我在 R 中创建了如下网络图:

edges2 <- graph.data.frame(edges)

edges3 <- as.undirected(edges2, mode='collapse')
summary(edges3)

plot(edges3)
edges

这是 edge3 变为无向后的样子:

IGRAPH UN-- 10 37 -- 
+ attr: name (v/c)
+ edges (vertex names):
 [1] 323--174 323--428 174--428 174--364 428--364
 [6] 174--422 428--422 364--422 174--329 428--329
 [11] 364--329 422--329 174--31  428--31  364--31 
 [16] 422--31  329--31  174--330 428--330 364--330
 [21] 422--330 329--330 31 --330 174--415 428--415
 [26] 364--415 422--415 329--415 31 --415 330--415
 [31] 174--392 428--392 364--392 422--392 329--392
 [36] 31 --392 330--392

所需的输出(因为在这种情况下,只有 323 和 392 不连接到除 428 之外的所有其他东西):

415  174 323
31   174 323
422  174 323
329  174 323
364  174 323
392  174 323
330  174 323
31   415 392
422  415 392
329  415 392
364  415 392
392  415 392
330  415 392
428  415 392
174  415 392 

我希望这是有道理的!谢谢

【问题讨论】:

  • 如果我复制您的 edges 数据并像您一样进行转换,edges3 看起来不像您的结果。您是否粘贴了完整版的边缘?或者你使用了head
  • 粘贴dput 对象的edges 结果将是最好的。
  • @Psidom 只是对其进行了更改以使其更易于复制。谢谢!
  • 您也可以在此处粘贴您之前提出的问题的所需输出,以便我们进行比较。
  • @Psidom 感谢您的反馈。稍微更改了数据以使其更有意义。这个概念对你有意义吗?

标签: r igraph


【解决方案1】:

如果我们从给定的边开始,首先我们构造一个igraph 对象,在这里我们将其称为G 而不是edges3,因为它是一个而不是.

library(igraph)
g <- graph.data.frame(edges)
G <- as.undirected(g, mode='collapse')

为了找到所有开放的三角形,我们循环遍历图的所有顶点,这就是lapply(as_ids(V(G)), ..在第一行所做的事情,并找出所有邻居并再次遍历它们,即lapply(as_ids(neighbors(G, v)), ..

我们在第四行进行条件检查,确保原点v与邻居的邻居之间的距离为2,从而保证三角形是开放的(未连接,也不是v本身)。

结果将作为有序向量返回,这有助于我们稍后删除重复的开放三角形,这是由第一行开头的unique 函数完成的。

openTriList <- unique(do.call(c, lapply(as_ids(V(G)), function(v) {
    do.call(c, lapply(as_ids(neighbors(G, v)), function(v1) {
        v2 <- as_ids(neighbors(G, v1))
        v2 <- v2[shortest.paths(G, v, v2) == 2]

        if(length(v2) != 0) {
            lapply(v2, function(vv2) { c(v, v1, vv2)[order(c(v, v1, vv2))] })
        } else { list() }
    }))
})))

这段代码会返回一个开放三角形的列表,你可以通过do.call(rbind, openTriList)将其转换为一个矩阵,其中每一行代表一个唯一的开放三角形:

> do.call(rbind, openTriList)
      [,1]  [,2]  [,3] 
 [1,] "174" "323" "364"
 [2,] "174" "323" "422"
 [3,] "174" "323" "329"
 [4,] "174" "31"  "323"
 [5,] "174" "323" "330"
 [6,] "174" "323" "415"
 [7,] "174" "323" "392"
 [8,] "323" "364" "428"
 [9,] "323" "422" "428"
[10,] "323" "329" "428"
[11,] "31"  "323" "428"
[12,] "323" "330" "428"
[13,] "323" "415" "428"
[14,] "323" "392" "428"
[15,] "174" "392" "415"
[16,] "392" "415" "428"
[17,] "364" "392" "415"
[18,] "392" "415" "422"
[19,] "329" "392" "415"
[20,] "31"  "392" "415"
[21,] "330" "392" "415"

【讨论】:

  • 我很高兴它有帮助!
  • 有没有办法只提取开放边缘?很难确定这个列表中的哪一个是开放边缘
  • 您可以将第 7 行从 lapply(v2, function(vv2) { c(v, v1, vv2)[order(c(v, v1, vv2))] }) 更改为 lapply(v2, function(vv2) c(v, v1, vv2))。因此,您将始终知道第一列和最后一列将是开放边缘。但这样一来,结果中就会出现重复记录。即一个空心三角形可以出现多次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
相关资源
最近更新 更多