首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中为-loop设置a

如何在R中为-loop设置a
EN

Stack Overflow用户
提问于 2013-10-07 11:17:25
回答 3查看 771关注 0票数 1

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

每个文件内容如下:

FILE_1.FASTA

代码语言:javascript
复制
>>TTBK2_Hsap ,(CK1/TTBK)
MSGGGEQLDILSVGILVKERWKVLRKIGGGGFGEIYDALDMLTRENVALKVESAQQPKQVLKMEVAVLKKLQGKDHVCRFIGCGRNDRFNYVVMQLQGRNLADLRRSQSRGTFT

FILE_2.FASTA

代码语言:javascript
复制
>>TTBK2_Hsap ,(CK1/TTBK)
MSGGGEQLDILSVGILVKERWKVLRKIGGGGFGEIYDALDMLTRENVALKVESAQQPKQVLKMEVAVLKKLQGKDHVCRFIGCGRNDRFNYVVMQLQGRNLADLRRSQSRGTFT

这个包(R中的protr)的工作原理如下:

代码语言:javascript
复制
x = readFASTA(system.file(’protseq/P00750.fasta’, package = ’protr’))[[1]]

extractAAC(x)

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

如果可能的话,请给我一些想法或任何例子,可以帮助我在R.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-08 06:07:47

这样做是很有可能的。一个很好的策略是编写一个函数来封装您想要对每个FASTA文件做什么:

代码语言:javascript
复制
# 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文件位于同一个目录中。

代码语言:javascript
复制
setwd("path/to/files")

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

代码语言:javascript
复制
fasta_files <- dir(pattern = "[.]fasta$")

注意,pattern参数告诉计算机只读取以".fasta“结尾的文件。

现在,我们使用vapply函数执行循环(有关详细信息,请参见下面的说明):

代码语言:javascript
复制
aa_comp <- vapply(fasta_files, read_and_extract, rep(pi, 20))

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

代码语言:javascript
复制
write.csv(aa_comp, file = "amino_acid_composition.csv")

vapply的详细信息

vapply函数是在R中执行for循环的一种奇特(而且速度更快)的方法--一开始它看起来有点混乱,但是如果您知道您的输出是什么的话,它会很好地工作。让我们看一下论点:

> 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")

票数 1
EN

Stack Overflow用户

发布于 2013-10-07 12:28:09

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

代码语言:javascript
复制
x <- list() # an empty list

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

您将在?Control下找到更多信息

票数 1
EN

Stack Overflow用户

发布于 2013-10-07 12:29:08

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

首先,如果您所要做的就是将所有的fasta文件合并成一个文件,那么从您的bash终端上看,它将比在R中容易得多

代码语言:javascript
复制
cat *.fasta > combined.fasta

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

代码语言:javascript
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19223440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档