首页 > 解决方案 > 为 csv 输出文件 R 创建一个循环

问题描述

我正在尝试在我的脚本中创建一个循环以获得输出文件。在我的脚本中,我已经有其他 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”我该怎么做?

标签: rloopscsv

解决方案


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

最简单的方法是使用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)
    
    }
}

推荐阅读