1

我是一名生物学家,对编程知之甚少。我有一系列文件(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 循环的示例。

4

3 回答 3

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。起初看起来有点令人困惑,但如果你知道你的输出将是什么,它会很好地工作。让我们看看论据:

> vapply(Argument1, Argument2, Argument3)

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

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

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

于 2013-10-08T06:07:47.093 回答
1

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

x <- list() # an empty list

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

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

于 2013-10-07T12:28:09.897 回答
1

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

首先,如果您想要做的只是将所有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)
}
于 2013-10-07T12:29:08.143 回答