基于存储在列出的数据框中的 ID 的 fasta 文件中的子集序列数据

Subset sequence data in fasta file based on IDs stored in listed data frames

我正在尝试根据存储在数据帧列表中的 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 和一些表达式值加载 table

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"

(依此类推)但是我想在一个 swift 中对所有数据帧进行子集移动以获得包含我想要的 fastas 的列表(3 个列表项,在这种情况下,每个包含 2 个序列) .我试过了:

FASTAs <- lapply(fastafile, function(i)
{fastafile[c(which(names(fastafile) %in% GOI.split[[i]][ ,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"