R根据数据框

时间:2017-08-25 11:04:54

标签: r loops random social-networking igraph

我有一个数据框"ref.df",其中包含12个网络的信息。我想根据节点和边数为每个主题创建100个随机网络。

我已尝试过这段代码,但效果并不好:

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

此代码仅为第一个主题生成100个随机网络。

提前感谢您的时间和建议。

您可以重现我的数据框:

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

1 个答案:

答案 0 :(得分:3)

如果问题是您需要12 x 100个网络并且您只获得100个列表,只需对代码进行最少的修改,您可以执行以下操作:

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

如果您想确保您生成的随机网络不同,您可能需要尝试以下方法,但由于交叉比较,这将非常慢。

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