当前位置: 首页 > 知识库问答 >
问题:

在R中的网络中创建节点之间的边

寇照
2023-03-14

我在R中使用igraph库创建了一个无向鄂尔多斯-仁义网络,它有100个节点,p=0.2:

library(igraph)

original <- erdos.renyi.game(100, 0.2, type = c("gnp", "gnm"), directed = FALSE,
    loops = FALSE)

我还创建了两个空网络:

net1 <- graph.empty(100)
net2 <- graph.empty(100)

我根据生成的随机数(0-1之间),从原始网络向net1和net2添加边。如果该随机数在0-0.1之间,则边进入net1,如果在0.1-0.9之间,则边进入net2,如果在0.9-1之间,则边同时进入net1和net2。

下面是我的代码,可以查看原始网络中的所有边缘,并将它们添加到net1、net2或两者中。

i <- 1
while (get.edge(original, E(original)[i])) { #looks through all nodes in original
                                                    #network
    # to generate a random number
    randnum <- runif(1, min=0, max=1)

    #to put the edge in net1, net2 or both
    head <- get.edge(original, E(original)[i])[1]
    tail <- get.edge(original, E(original)[i])[2]
    if (randnum >= 0 && randnum < 0.1) {
        net1 <- add.edges(net1, c(tail, head))  #puts edge in net1
    } else if (randnum >= 0.1 && randnum < 0.9) {
        net2 <- add.edges(net2, c(tail, head))  #puts edge in net2
    } else if (randnum >= 0.9 && randnum <= 1) {
        net1 <- add.edges(net1, c(tail, head))  #puts edge in net1
        net2 <- add.edges(net2, c(tail, head))  #puts edge in net2
    }
    i <- i + 1
}

通过上面的代码,我不断收到以下错误消息:

Error in if (id < 1 || id > ec) { : missing value where TRUE/FALSE needed

在“while”循环中多次出现此警告消息:

In while (get.edge(original, E(original)[i])) { :
    the condition has length > 1 and only the first element will be used

我不太清楚为什么会收到错误和警告消息,或者如何着手修复它们。

任何帮助都将不胜感激。

共有1个答案

祁永嘉
2023-03-14

您可以尝试使用for循环而不是while循环:

for (i in min(E(original)):max(E(original))) { #looks through all the nodes in
                    #the original network from the minimum to the maximum edge
    # to generate a random number
    randnum <- runif(1, min=0, max=1)

    #to put the edge in net1, net2 or both
    head <- get.edge(original, E(original)[i])[1]
    tail <- get.edge(original, E(original)[i])[2]
    if (randnum >= 0 && randnum < 0.1) {
        net1 <- add.edges(net1, c(tail, head))  #puts edge in net1
    } else if (randnum >= 0.1 && randnum < 0.9) {
        net2 <- add.edges(net2, c(tail, head))  #puts edge in net2
    } else if (randnum >= 0.9 && randnum <= 1) {
        net1 <- add.edges(net1, c(tail, head))  #puts edge in net1
        net2 <- add.edges(net2, c(tail, head))  #puts edge in net2
    }
}

使用for循环应该可以摆脱错误和警告消息,并且执行您在这里尝试执行的操作也会变得更加容易。

 类似资料:
  • 使用cypher和neo4j 2.0。 给定两组节点ID(长度相等)和一组权重,我想在相应的节点之间创建一个关系,并将权重设置为属性。例如,如果我有以下三个列表: 我想创建以下表示形式 但不是,例如 我可以通过迭代我的参数,然后创建单独的查询来实现这一点。有没有一种方法来批量运行它,将我的lsits作为参数传递,并要求按顺序匹配节点和属性? 我曾一度认为以以下方式使用参数会起作用,但它会创建关系的

  • 网络节点 服务基本没变动,除了 L3 服务需要配置为 dvr_snat 模式。 命名空间上会多一个专门的 snat-xxx 命名空间,处理来自计算节点的无 floating IP 的南北向流量。

  • 网络节点 网络节点担负着进行网络服务的任务,包括DHCP、路由和高级网络服务等。一般包括三个网桥:br-tun、br-int 和 br-ex。 $ sudo ovs-vsctl show49761e8e-031f-4a60-b838-28bb82aac7b7 Bridge br-int fail_mode: secure Port br-int

  • 网络节点 类似GRE模式下,br-eth1收到到达的网包,int-br-eth1和phy-br-eth1上分别进行vlan转换,保证到达br-int上的网包都是带有内部vlan tag,到达br-eth1上的都是带有外部vlan tag。br-ex则完成到OpenStack以外网络的连接。查看网桥信息,包括三个网桥,br-eth1、br-int和br-ex。 #ovs3bd78da8-d3b5-4

  • 网络节点 br-tun Bridge br-tun Port br-tun Interface br-tun type: internal Port patch-int Interface patch-int type: patch op

  • 我需要在所有具有相同属性值的节点之间创建关系。 例如,我可以使用以下查询: 但是如果我有大约200K的节点,这个脚本运行的时间相当长。 有没有其他更快的方法来建立这样的关系? 谢谢