【问题标题】:How to set a for -loop in R如何在 R 中设置 for 循环
【发布时间】:2013-10-08 14:07:47
【问题描述】:

我是一名生物学家,对编程知之甚少。我有一系列文件(fasta 格式文件),我需要为其应用 R 包。

每个文件内容如下:

FILE_1.FASTA

>>TTBK2_Hsap ,(CK1/TTBK)
MSGGGEQLDILSVGILVKERWKVLRKIGGGGFGEIYDALDMLTRENVALKVESAQQPKQVLKMEVAVLKKLQGKDHVCRFIGCGRNDRFNYVVMQLQGRNLADLRRSQSRGTFT

FILE_2.FASTA

>>TTBK2_Hsap ,(CK1/TTBK)
MSGGGEQLDILSVGILVKERWKVLRKIGGGGFGEIYDALDMLTRENVALKVESAQQPKQVLKMEVAVLKKLQGKDHVCRFIGCGRNDRFNYVVMQLQGRNLADLRRSQSRGTFT

包(R 中的 protr)的工作方式如下:

x = readFASTA(system.file(’protseq/P00750.fasta’, package = ’protr’))[[1]]

extractAAC(x)

有没有可能为上面的行设置一个forloop来读取多个文件并在一个文件中给出输出??

如果可能,请给我一些想法或任何可以帮助我在 R 中设置 for 循环的示例。

【问题讨论】:

  • 您可能想要lapply(dir(pattern='.fasta'), readFASTA) 之类的东西,但我对这个包不熟悉,所以您可能需要修改代码才能使其工作。

标签: r bioinformatics


【解决方案1】:

这是很有可能做到的。一个好的策略是编写一个函数来封装您想要对每个 FASTA 文件执行的操作:

# fasta is a string that represents the fasta file to be read.
read_and_extract <- function(fasta){
    seq <- readFASTA(fasta)[[1]]
    return(extractAAC(seq))
}

此包装器功能可让您一举读取 FASTA 文件并提取氨基酸组成。为了循环文件,我们需要与您的 FASTA 文件位于同一目录中。

setwd("path/to/files")

使用dir 命令,您可以获得该目录中存在的所有文件的名称。

fasta_files <- dir(pattern = "[.]fasta$")

请注意,pattern 参数告诉计算机仅读取以“.fasta”结尾的文件

现在我们使用vapply 函数执行循环(详情请参阅下面的注释):

aa_comp <- vapply(fasta_files, read_and_extract, rep(pi, 20))

这将产生一个矩阵,其中列是每个 fasta 文件,行是每个氨基酸。现在我们可以将它保存为一个简单的 csv 文件:

write.csv(aa_comp, file = "amino_acid_composition.csv")

vapply的详细信息

vapply 函数是在 R 中执行 for 循环的一种奇特(并且大多数时候更快)的方法。起初看起来有点令人困惑,但如果你知道你的输出将是什么,它会很好地工作。让我们看看论据:

&gt; vapply(Argument1, Argument2, Argument3)

  • Argument1:要循环的向量 (fasta_files)
  • Argument2:应用于向量每个元素的函数 (read_and_extract)
  • Argument3:预期输出 (rep(pi, 20))

最后一个参数最初是最难掌握的,但它是我们预期输出的代表向量。在这种情况下,extractAAC 的文档说它返回一个长度为 20 的数字向量。rep(pi, 20) 命令告诉 R 复制数字 pi 20 次,从而给出一个长度为 20 的数字向量。

vapply 有更通用的版本,可以返回任何类型的输出。有关这些的详细信息,请参阅help("vapply")

【讨论】:

  • 非常感谢您的精彩解释......它就像一个魅力:-)
  • 我可以将行作为fasta文件,将列作为氨基酸组成吗?
  • 确实可以!你想做的是transpose the matrix。您可以在 R 中使用函数 t() 简单地做到这一点,如下所示:transposed_matrix &lt;- t(your_matrix)
【解决方案2】:

这里有两件稍微复杂的事情;一种是循环,另一种是将所有结果写入文件。

首先,如果您要做的只是将所有fasta 文件合并为一个,那么在bash 终端上比在R 上要容易得多:

cat *.fasta > combined.fasta

但要回答您对R 的问题,您的循环可能如下所示:

write("", file="combined.fasta")  # make sure the file exists before appending
for (fileName in dir(pattern='.fasta')) {
    x = readFASTA(system.file(fileName, package = ’protr’))[[1]]
    # do stuff to x
    write(x, file="combined.fasta", append=TRUE)
}

【讨论】:

    【解决方案3】:

    您可以像这样使用直接的 for 循环:

    x <- list() # an empty list
    
    for(f in yourFileList) {
      x[[which(yourFileList==f)]] <- readFASTA(system.file(f,package='protr'))[[1]]
    }
    

    您可以在?Control 下找到更多信息

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 2011-06-02
      • 1970-01-01
      • 2021-08-20
      • 2019-08-25
      相关资源
      最近更新 更多