如何在igraph R中的图形组件之间添加边

我有一个包含 4 components 的图表。现在,我想根据 all componentssize of the membership 之间添加一条边。

例如,下图包含 4 components

如何在igraph R中的图形组件之间添加边

首先,我将连接 all components with only one edge and take the edge randomly。我可以用这个代码来做

graph1 <- graph_from_data_frame(g,directed = FALSE)
E(graph1)$weight <- g$new_ssp
cl <- components(graph1)

graph2 <- with(
  stack(membership(cl)),add.edges(
    graph1,c(combn(sapply(split(ind,values),sample,size = 1),2)),weight = runif(choose(cl$no,2))
  )
)

其次,现在我想在 component-1 and component-2 之间添加一条边。我想在 2 componentsrest of the component will be present in the new graph from the previous graph 之间添加一条边。

例如,在 component-1 and component-2 之间添加一条边后,新图将包含 3 component 1st (component-1 and component-2 as a 1 component because we added 1 edge),2nd (component-3 from the main graph),and 3rd (component-4 from the main graph)。我可以用这个代码来做

dg <- decompose.graph(graph1)
graph3 <- (dg[[1]] %u% dg[[2]])

component_subgraph_1 <- components(graph3)

graph2 <- with(
  stack(membership(component_subgraph_1)),weight = 0.01))

图:

如何在igraph R中的图形组件之间添加边

所有组合都相同。例如,component-1 and component-3component-1 and component-4component-2 and component-3component-2 and component-4component-3 and component-4

但是,编写代码并手动更改dg[[1]]dg[[2]] 等是不可行的。此外,我的实际数据集包含很多组件。所以,实际上,这是不可能的。 知道吗,我如何自动执行此操作?

实际上,我有一个评分函数(比如最短路径)。所以,我想在adding all components,或after adding only 2 componentsafter adding only 3 componentsso on之后查看分数!类似于 greedy algorithms

可重现的数据:

g <- structure(list(query = structure(c(1L,1L,2L,3L,4L,5L,5L),.Label = c("ID_00104","ID_00136","ID_00169","ID_00178","ID_00180"),class = "factor"),target = structure(c(16L,19L,20L,9L,6L,11L,13L,15L,8L,10L,14L,7L,12L,17L,18L
               ),.Label = c("ID_00169","ID_00288","ID_00324","ID_00394","ID_00663","ID_00790","ID_00846","ID_00860","ID_00910","ID_00959","ID_01013","ID_01047","ID_01130","ID_01222","ID_01260","ID_06663","ID_06781","ID_06786","ID_06791","ID_09099"),new_ssp = c(0.654172560113154,0.919096895578551,0.925821596244131,0.860406091370558,0.746376811594203,0.767195767195767,0.830379746835443,0.661577608142494,0.707520891364902,0.908193484698914,0.657118786857624,0.687664041994751,0.68586387434555,0.874513618677043,0.836646499567848,0.618361836183618,0.684163701067616,0.914728682170543,0.876297577854671,0.732707087959009,0.773116438356164)),row.names = c(NA,-21L),class = "data.frame")

提前致谢。

ll8039 回答:如何在igraph R中的图形组件之间添加边

你实际上已经接近你想要的了。也许下面的代码可以帮助你

out <- with(
  stack(membership(cl)),lapply(
    combn(split(ind,values),2,simplify = FALSE),function(x) {
      add.edges(
        graph1,c(combn(sapply(x,sample,size = 1),2)),weight = 0.01
      )
    }
  )
)

然后你就可以运行

sapply(out,plot)

可视化所有组合。

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

本文链接:https://www.f2er.com/684469.html

大家都在问