Создавайте файлы двоичных матриц после получения данных подсчета из списка - PullRequest
0 голосов
/ 08 июля 2020

В каталоге у меня есть много текстовых файлов, имена и формат файлов следующие:

SRS011061.txt
--------------------
contig SRS011061_idxstats.txt
BGC0000505 1
BGC0000505 1

SRS011090.txt
---------------------
contig SRS011090_idxstats.txt
BGC0000509 0
BGC0000509 1

SRS011271.txt
--------------------
contig SRS011271_idxstats.txt
BGC00001105 0
BGC00001105 0

Из этих файлов мне нужны результаты двух типов:

  1. В каждом файле, сколько генов (BG C**) присутствует, если учесть различный процент присутствия гена (1/0 - присутствие и отсутствие).

Для этого шага, Я использую:

setwd("~/Desktop/test")
filenames <- list.files(full.names=F, pattern=".txt")
output <-lapply(filenames,function(i){
  t<-read.csv(i, header=T, check.names = F, sep = " ")
  t$gene_count<-1
  t[,2][t[,2]>0]<-1
  pre_abs<-aggregate(. ~ contig, t, sum)
  colnames(pre_abs)<-c("BGC_Accession","Gene_presence", "Gene_count")
  pre_abs$Percentage<-(pre_abs$Gene_presence/pre_abs$Gene_count)*100
  gene_pre_100_percent<-length(pre_abs$Percentage[pre_abs$Percentage>=100])
  gene_pre_20_percent<-length(pre_abs$Percentage[pre_abs$Percentage>=20])
  data.frame(Combinations=i,gene_pre_100_percent=gene_pre_100_percent,gene_pre_20_percent=gene_pre_20_percent)
})
Step2_TP_FP<-do.call(rbind,output)
Step2_TP_FP[,1] <- data.frame(gsub(".txt.*$", "", Step2_TP_FP[,1]))

Здесь я получаю результаты, которые показывают, что при 100% и 20% завершении генов количество генов присутствует в каждом файле.

Combinations gene_pre_100_percent gene_pre_20_percent
SRS011061 1 1
SRS011090 0 1
SRS011271 0 0
Для тех же процентных критериев я хочу сделать двоичную матрицу отсутствия присутствия. Для 100% критериев матрица должна выглядеть так:
SRS011061 SRS011090 SRS011271
BGC0000505 1 0 0
BGC0000509 0 0 0
BGC00001105 0 0 0

А для 20% критериев это должно быть:

SRS011061 SRS011090 SRS011271
BGC0000505 1 0 0
BGC0000509 0 1 0
BGC00001105 0 0 0

Как создать эти два файла матрицы после получить результаты step1? Спасибо!

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Думаю, будет проще, если вы сохраните всю информацию и сохраните присутствие в процентах, вместо жесткого кодирования 20 или 80%, а затем сделаете матрицу за один раз. Например, для одного файла мы можем сделать:

output = lapply(fl,function(i){
   x = read.table(i,header=TRUE)
   cbind(aggregate(x[,2],list(gene=x[,1]),mean),
         file=sub(".txt","",i)
         )
})

output = do.call(rbind,output)

         gene   x      file
1  BGC0000505 1.0 SRS011061
2  BGC0000509 0.5 SRS011090
3 BGC00001105 0.0 SRS011271

Теперь нужно просто установить порог для получения матрицы, и вы измените его на 50%, 60% в любом случае, не читая файл в снова:

matrixfunc = function(da,perc){
  table(da$gene[da$x>perc],da$file[da$x>perc])
}

matrixfunc(output,0.8)
             
              SRS011061 SRS011090 SRS011271
  BGC0000505          1         0         0
  BGC0000509          0         0         0
  BGC00001105         0         0         0

matrixfunc(output,0.2)
             
              SRS011061 SRS011090 SRS011271
  BGC0000505          1         0         0
  BGC0000509          0         1         0
  BGC00001105         0         0         0
0 голосов
/ 09 июля 2020

Я обнаружил, что могу напечатать имена генов в выходной таблице следующим образом:

setwd("~/Desktop/test")
filenames <- list.files(full.names=F, pattern=".txt")
output <-lapply(filenames,function(i){
  t<-read.csv(i, header=T, check.names = F, sep = " ")
  t$gene_count<-1
  t[,2][t[,2]>0]<-1
  pre_abs<-aggregate(. ~ contig, t, sum)
  colnames(pre_abs)<-c("BGC_Accession","Gene_presence", "Gene_count")
  pre_abs$Percentage<-(pre_abs$Gene_presence/pre_abs$Gene_count)*100
  gene_pre_100_percent<-length(pre_abs$Percentage[pre_abs$Percentage>=100])
  gene_pre_20_percent<-length(pre_abs$Percentage[pre_abs$Percentage>=20])
  bgc_name <- unique(pre_abs$BGC_Accession)
  data.frame(Combinations=i,gene_pre_100_percent=gene_pre_100_percent,gene_pre_20_percent=gene_pre_20_percent, bgc_name=bgc_name)
})
Step2_TP_FP<-do.call(rbind,output)
Step2_TP_FP[,1] <- data.frame(gsub(".txt.*$", "", Step2_TP_FP[,1]))

Это дает мне:

Combinations    gene_pre_100_percent    gene_pre_20_percent bgc_name
SRS011061   1   1   BGC0000505
SRS011090   0   1   BGC0000509
SRS011271   0   0   BGC00001105

Теперь мне нужно найти способ изменить форму эту матрицу к вышеупомянутой структуре. Для этого, если нужно, я отправлю еще один вопрос. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...