-1

我对这里的一切都很陌生。我试图付出更多努力使我的代码可读。我正在编写为多个文件运行函数的代码。我有超过 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)。如果我一个一个地运行代码,它似乎可以工作。但是,如果我输入多个文件,它会为多个文件生成输出并停止工作。我无法弄清楚是什么导致了问题。

4

1 回答 1

1

如果您的代码适用于一个文件,则您收到的错误表明您的代码没有问题。g[[i]]如果唯一时间点的数量 < 1,您应该只会越界。

我怀疑正在发生的事情是存在格式错误或损坏的文件,该文件缺少temp <- list.files(*.csv).

由于您不习惯编写代码,因此我将通过,批评并为您解决一些问题:

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和您的edgelist.

当 时filename=paste(fname, i, ".csv"),该paste函数将在每个参数之间插入空格(即fname 1 .csv代替fname1.csv。您可以指定sep=""更改的行为pastepaste0用作速记。

将所有这些重新组合在一起:

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)
  }
}
于 2013-11-03T10:51:58.967 回答