Подмножество данных последовательности в файле fasta на основе идентификаторов, хранящихся в перечисленных фреймах данных

Я пытаюсь разбить один файл FASTA (содержащий несколько последовательностей) на несколько меньших на основе идентификаторов, которые я храню в списке фреймов данных (и

У меня есть FASTA под названием fastafile вот так:

 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)

Я загружаю таблицу с моими идентификаторами и некоторыми значениями выражений

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 фреймах данных. В этом фиктивном примере должно быть две последовательности для каждого элемента списка. Чтобы получить подмножество для первого из перечисленных фреймов данных, я могу сказать:

FASTA.1 <- fastafile[c(which(names(fastafile) %in% GOI.split[[1]][,1]))]
# $r1
# [1] "acatattggaggccgaaacaatgaggcgtgatcaactcagtatatcac"
# 
# $r2
# [1] "ctaacctctcccagtgtggaacctctatctcatgagaaagctgggatgag"

(и так далее), однако я хотел бы выделить подмножество для всех фреймов данных одним быстрым движением, чтобы получить список с моими желаемыми фастами (3 элемента списка, содержащие, в данном случае, по 2 последовательности каждый). Я пытался:

FASTAs <- lapply(fastafile, function(i)
{fastafile[c(which(names(fastafile) %in% GOI.split[[i]][ ,1]))]})

Не мог бы кто-нибудь сказать мне, почему это не работает и что мне нужно делать вместо этого.

Спасибо


person Moritz    schedule 19.06.2015    source источник
comment
Может потребоваться воспроизводимый отрывок из fastafile. Мне кажется, что вы выбираете столбцы с такими именами, как 1.1 и 1.2, что странно в vanilla R, но, возможно, нормально в seqinr.   -  person Frank    schedule 19.06.2015
comment
@Frank спасибо, я хотел бы добавить воспроизводимый отрывок, но я не знаю как. Любые указатели приветствуются.   -  person Moritz    schedule 19.06.2015
comment
@Frank и спасибо, что сообщили мне, что мне не удается объяснить себя. Я хочу, чтобы R сделал следующее: 1. Выберите столбец идентификаторов моих GOI.split элементов, 2. сопоставьте эти идентификаторы с именами последовательностей и 3. разделите исходный fasta таким же образом, как GOI.split (и предпочтительно вернуть его в виде списка) .   -  person Moritz    schedule 19.06.2015
comment
Один из способов предоставить fastafile - вызвать dput(fastafile), а затем скопировать и вставить здесь результат. Это позволит другим копировать и вставлять данные в R. Взгляните на как задать воспроизводимый вопрос R для получения дополнительных указателей.   -  person Jota    schedule 19.06.2015
comment
Спасибо, другой @Frank, за то, что разместили это. Хорошая ссылка там.   -  person Frank    schedule 19.06.2015


Ответы (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"
person Jota    schedule 19.06.2015