【问题标题】:Subset sequence data in fasta file based on IDs stored in listed data frames基于存储在列出的数据帧中的 ID 将 fasta 文件中的序列数据子集
【发布时间】:2026-02-07 00:05:01
【问题描述】:

我正在尝试根据我存储在数据帧列表中的 ID 将一个 FASTA 文件(包含多个序列)子集为几个较小的文件(以及

我有一个名为 fastafile 的 FASTA,如下所示:

 fastafile <- dput(fastafile)
structure(list(r1 = "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcac", 
    r2 = "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgag", 
    r3 = "atttcctcctgctgcccgggaggtaacaccctggacccctggagtctgca", 
    r4 = "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcgg", 
    r5 = "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgg", 
    r6 = "atttcctcctgctgcccgggaggtaacaccctggacccctggagtctgg"), .Names = c("r1", 
"r2", "r3", "r4", "r5", "r6"))

我使用这样的 seqinr 包加载:

fastafile <- read.fasta(file = "fastafile.fasta", 
                       seqtype = c("DNA","AA"),
                       as.string = TRUE, set.attributes = FALSE)

我用我的 ID 和一些表达式值加载一个表

GOI <- read.table(header = TRUE, text = "ID        T1        T2
1 r1 1.1 2.1
2 r2 1.2 2.2
3 r3 1.1 2.2
4 r4 1.2 2.1
5 r5 1.1 2.1
6 r6 1.2 2.2")

并将它们拆分为可管理的子集

GOI.split <- split(GOI,rep(1:3,each=2))

给我

> GOI.split
$`1`
  ID  T1  T2
1 r1 1.1 2.1
2 r2 1.2 2.2

$`2`
  ID  T1  T2
3 r3 1.1 2.2
4 r4 1.2 2.1

$`3`
  ID  T1  T2
5 r5 1.1 2.1
6 r6 1.2 2.2

现在我想根据 GOI.split 数据帧中的 ID 对我的序列进行子集化。在这个模拟示例中,每个列表项应该是两个序列。要获取列出的第一个数据框的子集,我可以说:

FASTA.1 <- fastafile[c(which(names(fastafile) %in% GOI.split[[1]][,1]))]
# $r1
# [1] "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcac"
# 
# $r2
# [1] "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgag"

(等等)但是我想在一个快速的动作中对所有数据帧进行子集化,以获得一个包含我想要的 fastas 的列表(3 个列表项,在这种情况下,每个包含 2 个序列)。我试过了:

FASTAs <- lapply(fastafile, function(i)
{fastafile[c(which(names(fastafile) %in% GOI.split[[i]][ ,1]))]})

有人可以告诉我为什么这不起作用以及我必须做什么。

谢谢

【问题讨论】:

  • 可能需要可复制的 fastafile 摘录。对我来说,您似乎正在选择名称为 1.11.2 的列,这在原版 R 中很奇怪,但在 seqinr 中可能很正常。
  • @Frank 谢谢,我想添加一个可复制的摘录,但我不知道如何。欢迎任何指点。
  • @Frank 并感谢您让我意识到我没有成功地让自己清楚。我想要R做的是:1.选择我的GOI.split项目的ID列,2.将这些ID与序列名称匹配3.以GOI.split的相同方式拆分原始fasta(并优先返回它作为一个列表)。
  • 提供 fastafile 的一种方法是调用 dput(fastafile),然后将结果复制并粘贴到此处。这将允许其他人将数据复制并粘贴到 R 中。查看how to ask a reproducible R question 以获取更多指示。
  • 感谢其他@Frank 发布该内容。那里有很好的参考。

标签: r subset fasta seq


【解决方案1】:

这可以通过以下代码完成:

split(fastafile[GOI$ID], rep(1:3,each=2))


$`1`
$`1`$r1
[1] "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcac"

$`1`$r2
[1] "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgag"


$`2`
$`2`$r3
[1] "atttcctcctgctgcccgggaggtaacaccctggacccctggagtctgca"

$`2`$r4
[1] "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcgg"


$`3`
$`3`$r5
[1] "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgg"

$`3`$r6
[1] "atttcctcctgctgcccgggaggtaacaccctggacccctggagtctgg"

至于为什么您的lapply 代码不起作用。一个原因是你传入了fastafile,你应该传入索引。

所以你正在尝试这个:

fastafile[c(which(names(fastafile) %in% GOI.split[[fastafile[[1]]]][ ,1]))]
#named list()

什么时候应该这样做:

fastafile[c(which(names(fastafile) %in% GOI.split[[1]][ ,1]))]
#$r1
#[1] "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcac"
#
#$r2
#[1] "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgag"

因此,要修复它,请传入 1:length(GOI.split) 而不是 fastafile

lapply(1:length(GOI.split), function(i)
 {fastafile[c(which(names(fastafile) %in% GOI.split[[i]][ ,1]))]})

[[1]]
[[1]]$r1
[1] "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcac"

[[1]]$r2
[1] "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgag"


[[2]]
[[2]]$r3
[1] "atttcctcctgctgcccgggaggtaacaccctggacccctggagtctgca"

[[2]]$r4
[1] "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcgg"


[[3]]
[[3]]$r5
[1] "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgg"

[[3]]$r6
[1] "atttcctcctgctgcccgggaggtaacaccctggacccctggagtctgg"

【讨论】:

    最近更新 更多