如何在R中设置for循环

如何在R中设置for循环,r,bioinformatics,R,Bioinformatics,我是一名生物学家,编程知识较少。我有一系列文件(fasta格式文件),我需要为它们应用一个R包 每个文件的内容如下: 文件_1.FASTA >>TTBK2_Hsap ,(CK1/TTBK) MSGGGEQLDILSVGILVKERWKVLRKIGGGGFGEIYDALDMLTRENVALKVESAQQPKQVLKMEVAVLKKLQGKDHVCRFIGCGRNDRFNYVVMQLQGRNLADLRRSQSRGTFT 文件2.FASTA >>TTBK2_Hsap ,(CK

我是一名生物学家,编程知识较少。我有一系列文件(fasta格式文件),我需要为它们应用一个R包

每个文件的内容如下:

文件_1.FASTA

>>TTBK2_Hsap ,(CK1/TTBK)
MSGGGEQLDILSVGILVKERWKVLRKIGGGGFGEIYDALDMLTRENVALKVESAQQPKQVLKMEVAVLKKLQGKDHVCRFIGCGRNDRFNYVVMQLQGRNLADLRRSQSRGTFT
文件2.FASTA

>>TTBK2_Hsap ,(CK1/TTBK)
MSGGGEQLDILSVGILVKERWKVLRKIGGGGFGEIYDALDMLTRENVALKVESAQQPKQVLKMEVAVLKKLQGKDHVCRFIGCGRNDRFNYVVMQLQGRNLADLRRSQSRGTFT
软件包(R中的protr)的工作原理如下:

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

extractAAC(x)
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)
}
是否有可能为上述行设置一个forloop来读取多个文件并在一个文件中给出输出


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

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

x <- list() # an empty list

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

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

首先,如果您要做的只是将所有的
fasta
文件合并到一个文件中,那么从
bash
终端执行操作要比在
R
终端中容易得多:

cat *.fasta > combined.fasta
但是要回答
R
的问题,您的循环可以如下所示:

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

extractAAC(x)
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)
}

这是很有可能做到的。使用的一个好策略是编写一个函数,封装您希望对每个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))
}
使用
dir
命令,可以获取该目录中存在的所有文件名

fasta_files <- dir(pattern = "[.]fasta$")
这将生成一个矩阵,列为每个fasta文件,行为每个氨基酸。现在我们可以将其保存为简单的csv文件:

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

vapply的详细信息
vapply
函数是为R中的
循环执行
的一种奇特的方法(大多数情况下速度更快)。起初它看起来有点混乱,但如果您知道您的输出将是什么,它会非常有效。让我们看看这些论点:

>vapply(Argument1、Argument2、Argument3)

  • 参数1:要循环的向量(
    fasta\u文件
  • 参数2:应用于向量的每个元素的函数(
    read\u和\u extract
  • 论证3:预期输出(
    rep(pi,20)
最后一个参数最初最难理解,但它是我们预期输出的代表向量。在这种情况下,
extractAAC
的文档说明它返回长度为20的数字向量。命令
rep(pi,20)
告诉R复制数字
pi
20次,从而给出长度为20的数字向量


有更通用的
vapply
版本可以返回任何类型的输出。请参阅
帮助(“vapply”)
以了解有关这些的详细信息。

您可能需要类似于
lappy(dir(pattern='.fasta')、readFASTA)的内容
,但我不熟悉此软件包,因此您可能需要使用代码才能使其正常工作。非常感谢您的精彩解释。。。它像一个符咒一样起作用:-)我能像氨基酸组成一样快速地生成行和列吗?确实可以!你想做的就是去做。只需在R中使用函数
t()
就可以做到这一点,就像这样:
transposed\u矩阵