2014-01-23 2 views
1

igraph 라이브러리를 사용하여 R에서 방향없는 Erdos-Renyi 네트워크를 만들었습니다.nework의 노드 간 에지 만들기 R

library(igraph) 

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

나는 또한 만든 두 개의 빈 네트워크 : 그것은 100 개 노드 및 P = 0.2가

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

당신은 대신 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 
    } 
} 

루프에 대한 오류 및 경고 메시지를 제거 얻을해야하고 사용 그것은 또한 더 많은 쉽게 무엇을해야하는 것입니다 너 여기서하려고하는거야.

+1

오, 대신 'for' 루프를 사용하지 않았다고 생각합니다. 고마워,이게 효과가있는 것 같아. – Warrior

+0

네트워크에 가장자리가 없으면 오류가 발생합니다. 또한 매우 비효율적입니다. 루프없이이 작업을 수행 할 수 있으며 동시에 모든 난수를 그려서 동시에 모든 가장자리를 추가 할 수 있습니다. –

+0

원본 네트워크에는 항상 하나 이상의 가장자리가 있습니다. 그래서 이걸해야한다고 생각 해요? – LoneWolf