Я создал неориентированную сеть 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
Я не совсем уверен, почему я получаю сообщения об ошибках и предупреждениях или как их исправлять.
Любая помощь будет высоко оценена.
О, я не думал об использовании цикла 'for'. Большое спасибо, кажется, это работает. – Warrior
Это не работает, если сеть не имеет границ, вы получите сообщение об ошибке. Кроме того, он очень неэффективен. Вы можете сделать это без циклов, просто нарисуйте все случайные числа одновременно и добавьте все ребра одновременно. –
Исходная сеть всегда будет иметь по крайней мере одно ребро. Поэтому я думаю, что так должно быть, верно? – LoneWolf