eabanoz
eabanoz

Reputation: 351

R create Random Networks according data frame

I have a data frame "ref.df" that has info about 12 networks. I want to create 100 random networks for each subject according their node and edge numbers.

I've tried this code but it didn't work well:

    library(igraph)

    random.networks <- list()

    for(i in ref.df$subject){
              cat("...")
              for( j in 1:100){
              random.networks[[j]] <- sample_gnm(n=ref.df$node,m=ref.df$edge, directed = TRUE, loops = FALSE)
              }
              cat(i,"\n")
            }

This code generate 100 random networks only for the first subject.

Thanks for your time and advice in advance.

You can reproduce my data frame:

ref.df <- data.frame(subject=c("Civil.Liberties","Foreign.Policy","Women.s.Rights","Workers..Rights",
                           "Political.Polarisation","Kurdish.Peace.Process","Parallel.State",
                           "HDP.Election.Slogans","Related.With.Election","CHP.Election.Slogans",
                           "AKP.Election.Slogans","MHP.Election.Slogans"),
                 group=c(298,1150,474,2522,0,2570,718,2736,0,1661,2175,1460),
                 mod=c(0.77,0.73,0.84,0.78,0,0.72,0.66,0.62,0,0.68,0.76,0.66),
                 node=c(13524,68792,21925,87094,195678,98008,28499,93024,201342,61539,91640,63035),
                 edge=c(18694,183932,27120,143032,710044,249267,108352,255615,579919,17590,3313147,213367))

Upvotes: 1

Views: 261

Answers (1)

Damiano Fantini
Damiano Fantini

Reputation: 1975

If the problem is that you want 12 x 100 networks and you are only getting a list of 100, with a minimal modification to your code, you can do as follows:

random.networks <- list()
for (subj in ref.df$subject){
  cat("...")
  for (i in 1:100) {
    tmp <- sample_gnm(n=ref.df$node[ref.df$subject == subj],
                      m=ref.df$edge[ref.df$subject == subj], 
                      directed = TRUE, loops = FALSE)
    random.networks[[(length(random.networks) + 1)]] <- tmp
    names(random.networks)[length(random.networks)] <- paste(as.vector(subj), i, sep = "_")
  }
  cat(as.vector(subj),"\n")
}

random.networks

If you want to make sure that the random networks you generate are different, you may want trying the following approach, but because of the cross comparisons, this will be very slow.

random.networks <- list()
look.up <- list()

for (subj in ref.df$subject){
  cat("...")
  for (i in 1:100) {

    tmp <- NA
    # enforce uniqueness
    while(is.na(tmp)|
          as.character(tmp)[4] %in% look.up) {
      tmp <- sample_gnm(n=ref.df$node[ref.df$subject == subj],
                        m=ref.df$edge[ref.df$subject == subj], 
                        directed = TRUE, loops = FALSE)
    }
    random.networks[[(length(random.networks) + 1)]] <- tmp
    look.up[[(length(look.up) + 1)]] <- as.character(tmp)[4]
    names(random.networks)[length(random.networks)] <- paste(as.vector(subj), i, sep = "_")
  }
  cat(as.vector(subj),"\n")
}

Upvotes: 3

Related Questions