我正在尝试根据存储在数据帧列表中的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]))]})
有人可以告诉我为什么这不起作用以及我必须做的事情。
由于
答案 0 :(得分: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"