如何通过基于时间段的子集构建网络

时间:2013-11-01 19:00:30

标签: r list matrix

我对这里的一切都很陌生。我试图付出更多努力使我的代码可读。我正在编写运行多个文件的函数的代码。我有超过100个文件,每个文件包含时间(会话)的边缘列表,如下所示:

Header: Time Sender Receiver

      1    1       2
      1    1       3
      2    2       1
      2    2       1
      3    1       2
      3    1       2

该功能的目的是根据“时间”从每个文件中提取子网络。由于有3个不同的时间段,每个文件将有3个子网络。以下是我写的代码:

SubsetNetwork <-function (file) {
  df = read.csv(file)
  uniq <-unique(unlist(df$Time))
  edgelist=list()
  g=list()
  for (i in 1:length(uniq)){
    g <- lapply(split(df, df$Time), function(x) {
      graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T)
    })
    edgelist[[i]]=get.edgelist(g[[i]])

    filename=paste(fname, i, ".csv")
    write.csv(edgelist[[i]], filename)
  }
}   

此代码将运行上面的函数。

temp = list.files(pattern="*.csv") 
for (i in 1:length(temp)){      
  file <-temp[i]              
  SubsetNetwork (file)
}    
  • 输入文件= 626234T.csv
  • 输出文件= 626234T1.csv,626234T2.csv,626234T3.csv。

我一直收到错误(Error in g[[i]] : subscript out of bounds)。如果我一个接一个地运行代码,它似乎有效。但是,如果我输入多个文件,它会为多个文件生成输出并停止工作。我无法弄清楚导致问题的原因。

1 个答案:

答案 0 :(得分:0)

如果您的代码对一个文件工作正常,那么您收到的错误表明它不是您的代码的问题。如果唯一时间点的数量是&lt; g[[i]],则temp <- list.files(*.csv)只会超出范围。 1。

我怀疑正在发生的事情是文件格式错误或损坏,缺少SubsetNetwork <-function (file) { df = read.csv(file) uniq <-unique(unlist(df$Time)) 正在接收的“时间”标题。

由于你不习惯编写代码,我会经历,批评和修复一些事情:

data.frames

unlist的列只是向量,因此您不需要 uniq <-unique(df$Time) 。代替:

  edgelist=list()
  g=list()
  for (i in 1:length(uniq)){
    g <- lapply(split(df, df$Time), function(x) {
      graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T)
    })
    edgelist[[i]]=get.edgelist(g[[i]])

    filename=paste(fname, i, ".csv")
    write.csv(edgelist[[i]], filename)
  }
}

足够了。

for

您可能实际上并不需要lapply循环。 split数据框的get.edgelist将返回整个列表,因此可以移出循环。如果 g <- lapply(split(df, df$Time), function(x) { graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T) }) edgelist <- lapply(g, get.edgelist) for (i in 1:length(uniq)){ filename=paste(fname, i, ".csv") write.csv(edgelist[[i]], filename) } } 被矢量化,那么它也可以移动到循环之外。因为我实际上并不知道我会认为这不仅仅是为了安全:

uniq

现在,您还不需要unique,因为g个时间点的数量只是edgelistfilename=paste(fname, i, ".csv")的长度。

paste时,fname 1 .csv函数会在每个参数之间插入空格(即fname1.csv而不是sep=""。您可以指定paste来更改paste0的行为或使用SubsetNetwork <-function (file) { df = read.csv(file) g <- lapply(split(df, df$Time), function(x) { graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T) }) edgelist <- lapply(g, get.edgelist) for (i in 1:length(g)){ filename=paste0(fname, i, ".csv") write.csv(edgelist[[i]], filename) } } 作为速记。

将所有重新组合在一起:

{{1}}