2015-06-19 64 views
2

我試圖子集的一個FASTA文件(包含多個序列)轉換成基於ID的幾個較小的餘存儲在數據幀(和子集序列的數據幀

的列表

我有一個名爲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和一些表達VAL UE的

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

一可能需要可複製的fastafile摘錄。對我來說,看起來你正在選擇名稱爲'1.1'和'1.2'的列,這在香草R中很奇怪,但在seqinr中可能是正常的。 – Frank

+0

@Frank謝謝,我想添加一個可重複的摘錄,但我不知道如何。任何指針都是受歡迎的。 – Moritz

+0

@Frank&謝謝讓我意識到我沒有成功地讓自己清晰。我想要R做的事情是:1.選擇我的'GOI.split'項目的ID列,2.將這些ID與序列名稱匹配並且3.以與分割GOI.split'相同的方式分割原始fasta並優先將其作爲列表返回)。 – Moritz

回答

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"