【发布时间】: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.1和1.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 发布该内容。那里有很好的参考。