2014-01-23 1 views
1

Я создал неориентированную сеть Erdos-Renyi в R, используя библиотеку igraph. Он имеет 100 узлов и р = 0,2:Создание ребер между узлами в nework в R

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) 

добавить края к net1 и net2, от исходной сети, на основе случайного числа (между 0-1), который сгенерирован. Если это случайное число находится между 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 

И это предупреждение, несколько раз, так как он проходит через 'а' петля:

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

Я не совсем уверен, почему я получаю сообщения об ошибках и предупреждениях или как их исправлять.

Любая помощь будет высоко оценена.

ответ

1

Вы можете попробовать использовать для цикла вместо время цикла:

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 
    } 
} 

Используя цикл должен избавиться от ошибок и предупреждающих сообщений, и это также будет намного проще делать то, что вы пытаетесь сделать здесь.

+1

О, я не думал об использовании цикла 'for'. Большое спасибо, кажется, это работает. – Warrior

+0

Это не работает, если сеть не имеет границ, вы получите сообщение об ошибке. Кроме того, он очень неэффективен. Вы можете сделать это без циклов, просто нарисуйте все случайные числа одновременно и добавьте все ребра одновременно. –

+0

Исходная сеть всегда будет иметь по крайней мере одно ребро. Поэтому я думаю, что так должно быть, верно? – LoneWolf

 Смежные вопросы

  • Нет связанных вопросов^_^