基于存储在列出的数据框中的 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"
我正在尝试根据存储在数据帧列表中的 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"