2015-03-03 3 views
1

Я работаю над большим набором данных на данный момент, и до сих пор я мог решить все свои идеи/проблемы с помощью бесчисленных поисковых запросов Google и долго пробуйте & ошибок сессии очень хорошо. Мне удалось использовать plyr и изменить функции для некоторых преобразований моих разных наборов данных и многому научился, но я думаю, что дошел до того, что мое настоящее знание R мне больше не поможет.Преобразование/преобразование изобилия (OTU) table/data.frame (в файл fasta) в R

Даже если мой вопрос звучит очень специфично (т. Е. Таблица OTU и файл fasta) Я предполагаю, что моя попытка - это распространенное приложение R во многих разных полях (а не только в биоинформатике).

Прямо сейчас, я слился файл ссылочной последовательности с таблицей изобилия, и я хотел бы, чтобы сформировать конкретный файл на основе информации этого data.frame - в FASTA файл.

Мой ДФ выглядит немного как это на данный момент:

repSeq  sw.1.102 sw.3.1021 sw.30.101 sw.5.1042 ... 
ACCT-AGGA 3  0   1   0 
ACCT-AGGG 1  1   2   0 
ACTT-AGGG 0  1   0   25 
... 

Получившийся файл должен выглядеть следующим образом:

>sw.1.102_1 
ACCT-AGGA 
>sw.1.102_2 
ACCT-AGGA 
>sw.1.102_3 
ACCT-AGGA 
>sw.1.102_4 
ACCT-AGGG 
>sw.3.1021_1 
ACCT-AGGG 
>sw.3.1021_2 
ACTT-AGGG 
>sw.30.101_1 
ACCT-AGGA 
>sw.30.101_2 
ACCT-AGGG 
... 

Как вы можете видеть, что я хотел бы использовать информацию о количество (ссылочных) последовательностей для каждого образца (т.е. sw.n) для создания файла (fasta).

У меня нет опыта с циклами в R (я использовал базовые циклы только во время простых попыток обработки), но я предполагаю, что это может сделать трюк здесь. Я нашел функцию write.fasta от пакета SeqinR, но я не мог найти там никакого решения. Команда deunique.seqs в mothur не работает, потому что ей нужен файл fasta в качестве входных данных (чего я, очевидно, не имею). Может быть очень возможно, что есть что-то на Bioconductor (OTUbase?), Но, честно говоря, я не знаю, с чего начать, и я рад любой помощи. И я действительно хотел бы сделать это в R, так как мне нравится работать с ним, но любые другие идеи также очень приветствуются.

// небольшой редактировать:

Оба ответа ниже работают очень хорошо (см мои комментарии) - Я также нашел два возможных не так элегантно обходные & не-R (пока не проверено):

  • Поскольку у меня уже есть файл таксономии и таблица OTU изобилия, я думаю, что команда mothur make.biom может быть использована для создания biom-format file. Я не работал с BIOM файлами, но я думаю, что есть некоторые инструменты и сценарии, доступные для сохранения данных BIOM-файлы, как FASTA снова
  • convert Qiime files to oligotyping format - это также нуждается в файле таксономии и таблице ОТА

Не уверен, что в обоих направлениях работает - поэтому, пожалуйста, исправьте меня, если я ошибаюсь.

ответ

1

Попробуйте это, он проходит через dataframe построчно и присоединяет повторы последовательностей:

fasta_seq<-apply(df,1,function(x){ 
     p<-x[1] 
     paste(unlist(mapply(function(x,y,z){ 
       if(as.numeric(y)>0) {paste(">",x,"_",(z+1):(z+y),"\n",p,"\n",sep="")} 
     },colnames(df)[-1],as.numeric(x[-1]),c(0,lag(cumsum(as.numeric(x[-1])))[-1]),USE.NAMES=F)),collapse="")     
     }) 

write(paste(fasta_seq,collapse=""),"your_file.txt") 
+0

Отлично, это сработало отлично! Большое вам спасибо за вашу помощь и работу. Уже поздно, но я проведу завтра некоторое время, чтобы понять, что вы сделали. Наверное, сейчас самое время узнать, как работает функция (x). До сегодняшнего дня я мог легко обойти его с неэлементными подходами и/или textwrangler. Ура! – plik

1

Вот ваши данные, принуждает к матрице (который является более естественным представлением для прямоугольных данных однородного типа) ,

df <- read.delim(textConnection(
    "repSeq  sw.1.102 sw.3.1021 sw.30.101 sw.5.1042 
    ACCT-AGGA 3  0   1   0 
    ACCT-AGGG 1  1   2   0 
    ACTT-AGGG 0  1   0   25" 
    ), sep="", row.names=1) 
m <- as.matrix(df) 

Трудная часть состоит в том, чтобы выяснить, как цифра дублировать имена столбцов. Я сделал это, создав последовательности соответствующей длины и un-listing. Затем я создал матрицу с двумя строками, первая (от репликации colnames() по требованию записей в исходной матрице) - это идентификатор, а вторая - последовательность.

csum <- colSums(m) 
idx <- unlist(lapply(csum, seq_len), use.names=FALSE) 
res <- matrix(c(sprintf(">%s_%d", rep(colnames(m), csum), idx), # id 
       rep(rownames(m)[row(m)], m)),     # sequence 
       nrow=2, byrow=TRUE) 

Используйте writeLines(res, "your.fasta") выписывать результаты, или setNames(res[2,], res[1,]) получить именованный вектор последовательностей.

+0

Привет, Мартин, спасибо за ваш ответ и помощь. Это также работает (с некоторыми небольшими обманами) очень хорошо. Я использовал sink(), чтобы сохранить вывод writeLines, и полученный файл fasta был довольно большим. Первые> 10000 строк были> X_n fasta names и сопровождались соответствующей последовательностью. После удаления верхней части файла остальная часть файла была почти такой же, как и выше, - с другой нумерацией, но с той же суммой/длиной. Следовательно, это работает! Я еще не знаю, вызвано ли это функцией sink() или моим входным файлом, но я увижу, могу ли я работать без дополнительного перетаскивания текста;) Cheers – plik

+0

@plik второй аргумент 'writeLines()' is имя файла для записи; нет необходимости в 'sink()'. Вероятно, вы объединили результаты в один и тот же файл. –

+0

Я все еще не мог понять, почему в последнем файле есть упомянутые выше дублеты. Я думаю, что это почему-то из-за преобразования df в матрицу, которое я выполнил. В любом случае, я хотел бы еще раз поблагодарить вас, потому что, хотя оба метода работают очень хорошо, ваша конкретная нумерация оказалась именно тем, что мне нужно для последующего анализа олиготипирования, который я имел в виду. Большой :) – plik