【问题标题】:Create a loop for a csv output file R为 csv 输出文件 R 创建一个循环
【发布时间】:2021-02-20 01:22:34
【问题描述】:

我试图在我的脚本中创建一个循环以获得输出文件。在我的脚本中,我已经有其他 2 个循环用于读取输入文件。在我的脚本结束时,我的环境中有一个 df,我想用输入文件的名称将其另存为 .csv。这是我的代码的简化版本:

    filePdbs <- Sys.glob("*.pdb")
    fileTurns <- Sys.glob("*.txt")
    for (filePdb in filePdbs) {
      "pdb" <- print(read.pdb(filePdb))
       
    ##other stuff here 
      
      "coord" <- print(read.pdb(filePdb)) 

    ##other stuff here 

      for (fileTurn in fileTurns) {
      "turn" <- read.delim(fileTurn, header = T, sep = "")

  ## here I have lines for merging info from pdb and txt and I obtain my df that I'd like to save as csv
    
      }
    }

对于这两个输入文件循环,我必须为具有相同输入文件名称的 csv 输出创建第三个全局循环。 输入文件类似于“1abc_A.pdb”和“1abc_A.txt”,我希望输出“1abc_A.csv” 我该怎么做?

【问题讨论】:

  • 首先,您需要纠正未对这些循环内的分配进行索引的基本错误。您正在覆盖输入工作的结果。
  • 另外,为什么引用您返回的对象,例如“转”filePdb时都会循环阅读fileTurns。这似乎是浪费时间。如果文件不是很大,将每种类型的所有内容读入列表会更有效然后使用循环处理列表。
  • 我需要在同一个文件夹中的 1072 个文件 pdb 和 1072 个文件 txt 上执行我的脚本
  • 另外,我合并了 pdb 和 txt 中的信息,所以我需要同时阅读它们。但我是 R 新手,所以如果有更好的方法,请告诉我

标签: r loops csv


【解决方案1】:

正如 cmets 中已经指出的那样,我发现您的代码存在几个问题,但据我所知,实际问题是如何更改以字符串结尾的文件。

最简单的方法是使用sub(pattern="pdb$", replacement="csv", x=filePdb)。这会在字符串末尾找到字母“pdb”($ 表示行尾)并将其替换为“csv”。在修改变量后,我会立即将此行放在您的第二次查看中。或者,您可以使用filePdbs 而不是filePdb,并在使用之前先保存所有修改过的文件名。

以下是我将在您的代码示例中更改的内容:

当您读入不需要的文件时,print 在大多数情况下会将内容打印到控制台,但我们希望将文件内容保存在变量中。

变量没有引号。在名称周围加上引号会更改含义,并且您会得到一个无法存储任何内容的字符串。

您似乎在循环中读取了 filePdb 文件两次。这是低效的。如果您想使用坐标访问矩阵并将其存储在名为“coord”的变量中,您可以使用pdb$xyz 获取矩阵(我们在这里讨论的是 bio3d 包,对吧?)。

然后你循环遍历每个 .pdb 文件的每个 .txt 文件。 ([没有 txt] * [没有 pdb])。我认为您可能有文件对,如果是这样,每个 pdb 文件只需要打开 1 个 txt 文件。您可以通过

实现这一目标
for (i in seq(along=filePdbs)) {
    pdb <- read.pdb(filePdbs[i])
    turn <- read.delim(fileTurn[i], header = T, sep = "")
    # ...
}

(确保 sep 参数符合您的目的。)

最后,如上所述,将write.csv()(或用于更多控制输出设置的write.table())放在您的内部循环中,并使用sub() 修改名称。

filePdbs <- Sys.glob("*.pdb")
fileTurns <- Sys.glob("*.txt")

for (filePdb in filePdbs) {
    pdb <- read.pdb(filePdb)
       
    ##other stuff here 
      
    coord <- pdb$xyz

    ##other stuff here 

    for (fileTurn in fileTurns) {
        turn <- read.delim(fileTurn, header = T, sep = "")

        ## here I have lines for merging info from pdb and txt and I obtain my df that I'd like to save as csv
    
        write.csv(result,
                  file=sub("pdb$", "csv", x=filePdb),
                  row.names=F)
    
    }
}

【讨论】:

  • 首先非常感谢!!!是的,它是 bio3d 包。我要修改我的错误,但是关于坐标它有点不同,因为我不需要所有原子的坐标,只需要我选择的那些,所以我需要读取所有 pdb 文件,然后只选择我感兴趣的最后得到坐标。无论如何,我尝试了您的解决方案并且它有效!谢谢!
  • 我正在检查输出文件,我得到了所有 csv 文件,但打开它们都是同一个文件,但名称不同。文件内容相同,R读取的最后一个
  • 我有一个名称不同但内容相同的文件列表
  • 另外,在 8 个文件上运行脚本(总是有关于内容的错误)它没有问题,而是在 1072 个文件上运行脚本它崩溃。似乎 R 没有足够的时间同时执行此操作,因此它崩溃了。也许有必要创建第三个全局循环,在执行关于 pdb 和 txt 的循环之后,写入 csv。所以在开始时打开它并在整个脚本结束时关闭它。这样也许也可以避免内容的错误
  • 很高兴听到您取得了进展。所以文件名问题解决了,现在我们有关于内容的第二个问题。不幸的是,我不太清楚您想如何处理数据,因此恐怕我无法在没有更多细节的情况下为您提供非常有效的建议。打开所有文件听起来确实对您的 R 会话具有挑战性,通常您应该尝试打开尽可能少的文件(但同时以最低频率打开文件 - 最有可能一次)。最佳策略当然取决于您的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2016-05-16
  • 2020-11-04
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多