r - igraph:在每条边的中间添加新节点

标签 r igraph

我有一个图,每个节点和边都有自己的属性(例如,节点具有不同的高程,边具有不同的直径和长度)。

现在,我想在每条边的中间添加新节点,并将两个连接到管道的节点的平均高程分配给新节点。 Add new nodes 如果网络具有大量节点和边,我更喜欢在循环中执行这些操作。

这是a simple graph exported from R 。使用以下命令将其加载到 R:

library(igraph)
g = readRDS("g.rds")
plot (g)

plot (g)

这些节点具有不同的高程,边缘具有不同的长度和直径,但似乎我无法使用“g.rds”导出它们,因此运行下面的代码来添加这些属性:

E(g)$Length = c(1000, 1000, 1000, 1000)
E(g)$Diameter = c(500, 500, 500, 500)
V(g)$Elevation = c(10, 50, 30, 30)

>dput(g):
structure(list(4, FALSE, c(3, 2, 2, 1), c(0, 0, 1, 0), c(3, 1, 
2, 0), c(3, 1, 0, 2), c(0, 0, 1, 3, 4), c(0, 3, 4, 4, 4), list(
    c(1, 0, 1), structure(list(), names = character(0)), list(
        name = c("J-1", "J-2", "J-3", "R-1"), XCoord = c(1248.164, 
        5991.189, 2246.696, -631.424), YCoord = c(5976.505, 5741.557, 
        3113.069, 7621.145), color = c("gray", "gray", "gray", 
        "orange"), shape = c("circle", "circle", "circle", "square"
        ), elevation = c(10L, 50L, 30L, 10L), Elevation = c(10L, 
        50L, 30L, 30L)), list(label = c("P-1", "P-2", "P-3", 
    "P-4"), Diameter = c(500L, 500L, 500L, 500L), Lenght = c(1000L, 
    1000L, 1000L, 1000L), label_no_P = c(1, 2, 3, 4), Length = c(1000L, 
    1000L, 1000L, 1000L))), <environment>), class = "igraph")

最佳答案

您可以使用edgelist尝试下面的代码

el <- get.edgelist(g)

pmid <- setNames(
  rowMeans(matrix(V(g)$Elevation[match(el, names(V(g)))], ncol = 2)),
  paste0("P-", 1:nrow(el))
)

w <- c(setNames(V(g)$Elevation, V(g)$name), pmid)

out <- graph_from_edgelist(rbind(
  cbind(el[, 1], paste0("P-", 1:nrow(el))),
  cbind(paste0("P-", 1:nrow(el)), el[, 2])
), directed = FALSE) %>%
  set_vertex_attr(name = "name", value = paste0(V(.)$name, ": ", w[V(.)$name])) %>%
  set_vertex_attr(name = "color", value = startsWith(V(.)$name, "P"))

enter image description here

关于r - igraph:在每条边的中间添加新节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74829150/

相关文章:

R visNetwork : Multiple graph layout?

r - 设置网络中病毒传播的起始节点

r - 如何计算 R 表中每一行的唯一值?

r - R中for循环的替代方案?

r - 在igraph中添加图例以注释差异顶点大小

R igraph索引

python - 多重图的线图

r - 了解 all_equal 的输出

r - 通过不在该 data.table 中的列通过行扩展 R data.table?

r - 如何在 R 中使用带有 `grep` 的反向引用?